java轻复制,浅谈java轻重拷贝

浅谈java深浅拷贝

在一个论坛上看到了一个关于深浅拷贝的文章,引用地址:http://bbs.itcast.cn/thread-14646-1-2.html

概念:

(1)浅拷贝(浅克隆)被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用仍然只指向原来的对象。

(2)深拷贝(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向被复制过的新对象,深复制把要复制的对象所引用的对象都复制了一遍。

实现拷贝需要实现Cloneable接口并且重写clone方法。

(1)如果类型仅包含值类型(int,byte等类型)和string类型的数据成员,我们只要在clone方法中初始化一个新的对象,并调用超类的方法clone方法。

(2)如果自定义类型包含引用类型的数据成员,必须考虑clone方法是实现浅拷贝(shallow copy)还是深拷贝(deep copy)。

话不多说:贴代码:

package test.clone;

public class Person implements Cloneable{

String name;

String age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

@Override

public Object clone() {

Person p=null;

try{

p=(Person) super.clone();

}catch(CloneNotSupportedException e) {

e.printStackTrace();

}

return p;

}

}

package test.clone;

public class Student implements Cloneable{

Person person;

String klass;

public Person getPerson() {

return person;

}

public void setPerson(Person person) {

this.person = person;

}

public String getKlass() {

return klass;

}

public void setKlass(String klass) {

this.klass = klass;

}

@Override

public Object clone() {

Student obj = null;

try {

obj = (Student) super.clone();

} catch (CloneNotSupportedException ex) {

ex.printStackTrace();

}

obj.person=(Person)person.clone();//如果没有这句则属于浅拷贝;读者可以自行测试

return obj;

}

}

package test.clone;

public class TestClone {

public static void main(String[] args) {

Student s1=new Student();

Person p1=new Person();

p1.setName("Student1");

p1.setAge("21");

s1.setKlass("class1");

s1.setPerson(p1);

Student s2=(Student) s1.clone();

s2.getPerson().setName("Student2");

System.out.println(s1.getPerson().getName()+"------克隆之前的Student1");

System.out.println(s2.getPerson().getName()+"------克隆之后的Student2");

}

}

运行结果:

Student1------克隆之前的Student1

Student2------克隆之后的Student2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值