浅谈Java中的克隆close()和赋值引用的区别
学生类Student:
package克隆clone;
/*要克隆必须实现这个借口:Cloneable,以标记这个对象可以克隆
Cloneable:此类实现了Cloneable接口,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。
这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
*/
publicclassStudentimplementsCloneable{
privateStringname;
privateintage;
publicStudent(){
}
publicStudent(Stringname,intage){
super();
this.name=name;
this.age=age;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
//重写克隆方法子列才可以调用
@Override
protectedObjectclone()throwsCloneNotSupportedException{
returnsuper.clone();
}
}
测试克隆学生类:
package克隆clone;
/*
* protectedvoidfinalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。用于垃圾回收,但是什么时候回收不确定。
* protectedObjectclone():创建并返回此对象的一个副本。
* A:重写该方法
*
*Cloneable:此类实现了Cloneable接口,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。
* 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。
*/
publicclassStudentClone{
publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{
//创建学生对象
Students=newStudent();
s.setName("林青霞");
s.setAge(27);
//克隆学生对象
Objectobj=s.clone();
Students2=(Student)obj;
System.out.println("---------");
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());
//以前的做法
Students3=s;
System.out.println(s3.getName()+"---"+s3.getAge());
System.out.println("---------");
//其实是有区别的
s3.setName("刘意");
s3.setAge(30);
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());
System.out.println(s3.getName()+"---"+s3.getAge());
System.out.println("---------");
//把克隆的改一下呢?
s2.setName("克隆改的名称");
s2.setAge(66);
System.out.println(s.getName()+"---"+s.getAge());
System.out.println(s2.getName()+"---"+s2.getAge());
System.out.println(s3.getName()+"---"+s3.getAge());
//也就是说把一个对象的引用赋值给一个引用,当这个引用发什么该改变的时候,同一个引用指向的对象会发生改变,但是克隆的不会变化,
//把克隆的对象改变他的一些属性,那么也不会影响到其他的对象的值的改变
}
}
以上就是小编为大家带来的浅谈Java中的克隆close()和赋值引用的区别的全部内容了,希望对大家有所帮助,多多支持毛票票~