除了可以直接复制java中的对象,我们还可以创建新对象进行拷贝,如果只是简单的复制属性,那么这种就是浅拷贝了。需要注意的是,因为拷贝的类型不同,所以在赋值上分为值赋值和引用赋值两种。下面我们就java浅拷贝的概念、原理进行学习,然后在代码中使用浅拷贝。
1.概念
浅拷贝会创建一个新对象,新对象和原对象本身没有任何关系,新对象和原对象不等,但是新对象的属性和老对象相同。具体可以看如下区别:
(1)如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值;
(2)如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
2.原理
如果原型对象的成员变量是值类型,将复制一份给克隆对象,也就是说在堆中拥有独立的空间;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。换句话说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
3.使用实例
需要拷贝的类上实现Cloneable接口并重写其clone()方法
classFather{ Stringname; publicFather(Stringname){ this.name=name; } @Override publicStringtoString(){ return"Father{"+ "name='"+name+'\''+ '}'; } } classSonimplementsCloneable{ intage; Stringname; Fatherfather; publicSon(Stringname,intage){ this.age=age; this.name=name; } publicSon(Stringname,intage,Fatherfather){ this.age=age; this.name=name; this.father=father; } @Override publicStringtoString(){ return"Son{"+ "age="+age+ ",name='"+name+'\''+ ",father="+father+ '}'; } @Override protectedSonclone()throwsCloneNotSupportedException{ return(Son)super.clone(); } } publicclasstest{ publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{ Fatherf=newFather("bigFather"); Sons1=newSon("son1",13); s1.father=f; Sons2=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(); //但是他们的Fatherfather和Stringname的引用一样 s1.age=12; s1.father.name="smallFather";//s1.father引用未变 s1.name="son222";//类似s1.name=newString("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); } }
原文来自:https://www.py.cn
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容