引用复制
两个引用指向同一个对象
Person p = new Person(23, "zhang");
Person p1 = p;
System.out.println(p ==p1); //true
p的修改会导致p1修改(不管是基本类型还是应用类型),反之一样
无论深复制还是浅复制都会新创建一个对象,而引用不会创建对象
浅拷贝:拷贝对象和原始对象的引用类型引用同一个对象
public class ShallowCloneExample implements Cloneable {
private int[] arr;
private String name;
private Integer age;
public ShallowCloneExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
name="好";
age=10;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void set(int index, int value){
arr[index]=value;
}
public int get(int index){
return arr[index];
}
@Override
protected ShallowCloneExample clone() throws CloneNotSupportedException {
return (ShallowCloneExample)super.clone();
}
public static void main(String[] args) {
ShallowCloneExample e1 = new ShallowCloneExample();
ShallowCloneExample e2=null;
try {
e2=e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
e1.set(2,222);
e1.setName("坏");
e1.setAge(20);
System.out.println(e2.get(2)+":"+e2.getName()+":"+e2.getAge()); //222:好:10
e2.set(2,333);
e2.setName("好了");
e2.setAge(15);
System.out.println(e2.get(2)+":"+e2.getName()+":"+e2.getAge()); //333:好了:15
System.out.println(e1.get(2)+":"+e1.getName()+":"+e1.getAge()); //333:坏:20
}
}
①对于数据类型是(基本数据类型,包装数据类型,String),浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。
②对于数据类型是部分引用数据类型(数组,对象等)的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。
总结:
引用复制:基本类型与引用类型都会因为一个引用对象的内容改变,导致另外一个引用对象的内容改变
浅拷贝: 基本类型和包装类型与String 不会改变,但对象,数组等引用类型 会因为一个引用对象的内容改变,导致另外一个引用对象的内容改变
深拷贝: 拷贝对象和原始对象的引用类型引用不同对象,基本类型与引用类型,不会因为一个引用对象的内容改变,导致另外一个引用对象的内容改变。