
除了可以直接复制java中的对象,我们还可以创建新对象进行拷贝,如果只是简单的复制属性,那么这种就是浅拷贝了。需要注意的是,因为拷贝的类型不同,所以在赋值上分为值赋值和引用赋值两种。下面我们就java浅拷贝的概念、原理进行学习,然后在代码中使用浅拷贝。
1.概念
浅拷贝会创建一个新对象,新对象和原对象本身没有任何关系,新对象和原对象不等,但是新对象的属性和老对象相同。具体可以看如下区别:
(1)如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值;
(2)如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
2.原理
如果原型对象的成员变量是值类型,将复制一份给克隆对象,也就是说在堆中拥有独立的空间;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。换句话说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

3.使用实例
需要拷贝的类上实现Cloneable接口并重写其clone()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | class Father{
String name;
public Father(String name) {
this .name=name;
}
@Override
public String toString() {
return "Father{" +
"name='" + name + '\ '' +
'}' ;
}
}
class Son implements Cloneable {
int age;
String name;
Father father;
public Son(String name,int age) {
this .age=age;
this .name = name;
}
public Son(String name,int age, Father father) {
this .age=age;
this .name = name;
this .father = father;
}
@Override
public String toString() {
return "Son{" +
"age=" + age +
", name='" + name + '\ '' +
", father=" + father +
'}' ;
}
@Override
protected Son clone() throws CloneNotSupportedException {
return (Son) super .clone();
}
}
public class test {
public static void main(String[] args) throws CloneNotSupportedException {
Father f= new Father( "bigFather" );
Son s1 = new Son( "son1" ,13);
s1.father=f;
Son s2 = s1.clone();
System.out.println(s1);
System.out.println(s2);
System.out.println( "s1==s2:" +(s1 == s2));
System.out.println( "s1.name==s2.name:" +(s1.name == s2.name));
System.out.println();
s1.age=12;
s1.father.name= "smallFather" ;
s1.name= "son222" ;
System.out.println( "s1.Father==s2.Father:" +(s1.father == s2.father));
System.out.println( "s1.name==s2.name:" +(s1.name == s2.name));
System.out.println(s1);
System.out.println(s2);
}
}
|
以上就是java浅拷贝的使用,对于这种简单的复制方法,大家只要考虑拷贝时的数据类型就可以了。当然除了浅拷贝外,对应就出现了深拷贝,大家可以持续关注这方面的内容。