java学习笔记
Java中 对象赋值给另一个对象的4种方法
本 文 目 录
在Java中,对象赋值给另一个对象可以通过多种方式实现,以下是一些主要的方法及其特点:
1、对象赋值给另一个对象的4中方式对比
方法 | 描述 | 示例代码 |
---|---|---|
浅拷贝 | 拷贝对象的引用,不拷贝对象的内容。如果对象包含对其他对象的引用,那么这些引用也会被复制。 | Object shallowCopy = originalObject; |
深拷贝 | 拷贝对象的内容,如果对象包含对其他对象的引用,那么这些引用也会被复制。 | Object deepCopy = new Object(originalObject); |
对象克隆 | 创建一个新的对象,并复制原始对象的所有字段到新对象。可以是浅拷贝或深拷贝,取决于具体的实现。 | Object clonedObject = originalObject.clone(); |
通过getters和setters赋值 | 通过使用对象的getters和setters方法来获取和设置属性值。适合于具有复杂属性的对象。 | originalObject.setField1(value1); originalObject.setField2(value2); |
2、浅拷贝对象赋值给另一个对象
在Java中,浅拷贝对象赋值给另一个对象意味着只复制对象的引用,而不复制对象的内容。如果对象包含对其他对象的引用,那么这些引用也会被复制。下面是一个示例代码,演示了如何将一个浅拷贝对象赋值给另一个对象:
public class ExampleClass implements Cloneable {
private int field1;
private String field2;
private AnotherClass anotherObject;
// 构造函数、getters和setters方法省略
// 实现Cloneable接口并重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class AnotherClass {
private int value;
// 构造函数、getters和setters方法省略
}
// 创建一个原始对象
ExampleClass originalObject = new ExampleClass();
originalObject.setField1(1);
originalObject.setField2("Test");
originalObject.setAnotherObject(new AnotherClass());
// 将原始对象浅拷贝给另一个对象
try {
ExampleClass shallowCopyObject = (ExampleClass) originalObject.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
3、深拷贝对象赋值给另一个对象
深拷贝对象赋值给另一个对象意味着创建一个新的对象,并复制原始对象的所有属性及其引用的对象,以确保新对象和原始对象完全独立。在Java中,深拷贝通常需要自己实现,可以通过递归复制对象的方式来完成。下面是一个示例代码,演示了如何将一个深拷贝对象赋值给另一个对象:
import java.io.*;
public class ExampleClass implements Serializable {
private int field1;
private String field2;
private AnotherClass anotherObject;
// 构造函数、getters和setters方法省略
}
public class AnotherClass implements Serializable {
private int value;
// 构造函数、getters和setters方法省略
}
// 创建一个原始对象
ExampleClass originalObject = new ExampleClass();
originalObject.setField1(1);
originalObject.setField2("Test");
originalObject.setAnotherObject(new AnotherClass());
// 将原始对象深拷贝给另一个对象
ExampleClass deepCopyObject = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(originalObject);
oos.flush();
oos.close();
baos.flush();
baos.close();
byte[] serializedData = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);
ObjectInputStream ois = new ObjectInputStream(bais);
deepCopyObject = (ExampleClass) ois.readObject();
ois.close();
bais.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
4、对象克隆对象赋值给另一个对象
在Java中,可以使用对象克隆来将一个对象赋值给另一个对象。对象克隆是通过调用对象的clone()
方法来创建一个与原始对象具有相同属性和值的新对象。为了使用对象克隆,需要实现Cloneable
接口并重写clone()
方法。下面是一个示例代码,演示了如何使用对象克隆将一个对象赋值给另一个对象:
public class ExampleClass implements Cloneable {
private int field1;
private String field2;
private AnotherClass anotherObject;
// 构造函数、getters和setters方法省略
// 实现Cloneable接口并重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class AnotherClass implements Cloneable {
private int value;
// 构造函数、getters和setters方法省略
// 实现Cloneable接口并重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 创建一个原始对象
ExampleClass originalObject = new ExampleClass();
originalObject.setField1(1);
originalObject.setField2("Test");
originalObject.setAnotherObject(new AnotherClass());
// 使用对象克隆将原始对象赋值给另一个对象
ExampleClass clonedObject = null;
try {
clonedObject = (ExampleClass) originalObject.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
5、通过getters和setters赋值
通过getters和setters赋值是一种常见的方法,用于将一个对象的属性值赋给另一个对象的相应属性。这种方法要求每个属性都有相应的getter和setter方法。下面是一个示例代码,演示了如何使用getters和setters赋值将一个对象的属性值赋给另一个对象:
public class ExampleClass {
private int field1;
private String field2;
private AnotherClass anotherObject;
public int getField1() {
return field1;
}
public void setField1(int field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public AnotherClass getAnotherObject() {
return anotherObject;
}
public void setAnotherObject(AnotherClass anotherObject) {
this.anotherObject = anotherObject;
}
}
public class AnotherClass {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
// 创建两个对象
ExampleClass object1 = new ExampleClass();
ExampleClass object2 = new ExampleClass();
// 使用getters和setters赋值
object2.setField1(object1.getField1());
object2.setField2(object1.getField2());
AnotherClass anotherObject = object1.getAnotherObject();
if (anotherObject != null) {
object2.setAnotherObject(new AnotherClass());
object2.getAnotherObject().setValue(anotherObject.getValue());
}
- 上一篇
Java参数传递 基本数据类型和引用数据类型(表格对比)
在Java中,参数传递主要有两种方式:基本数据类型和引用数据类型的传递。这两种方式在传递过程中有不同的特性,如下表所示:## 基本数据类型和引用数据类型参数传递对比| 对比项 | 基本数据类型 | 引用数据类型 || --- | --- | --- || 参数传递方式 | 值传递 | 值传递(传递的是引用) || 是否改变原始数据 | 不会改变原始数据 | 可能改变原始数据(通过引用的方式) ||
- 下一篇
Java解析XML常用的方法对比
Java中常用的解析XML的方法有DOM(Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML)和JDOM。