Dalam kod di bawah, kenapa
//对引用的对象也进行复制
o.p=(Professor)p.clone();
Adakah mungkin untuk mencapai salinan mendalam?
class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
public class Student implements Cloneable
{
String name;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
Student o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
//对引用的对象也进行复制
o.p=(Professor)p.clone();
return o;
}
public static void main(String[] args)
{
Professor p=new Professor("wangwu",50);
Student s1=new Student("zhangsan",18,p);
Student s2=(Student)s1.clone();
s2.p.name="lisi";
s2.p.age=30;
//学生1的教授不 改变。
System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
System.out.println("name="+s2.p.name+","+"age="+s2.p.age);
}
}
Ini hanya nampak sebagai "salinan mendalam" di permukaan Sebenarnya, Pelajar mahupun Profesor tidak melaksanakan salinan mendalam.
Anda menambah beberapa output pada kaedah utama:
Anda boleh lihat bahawa nama s1 dan s2 masih "==" Apabila p.name tidak ditetapkan, nama mereka juga "==", jadi tiada salinan mendalam dilaksanakan.
Apabila anda menetapkan s2.p.name, s2.p.name menghala ke alamat pemalar rentetan lain, jadi (s1.p.name == s2.p.name);
Ini adalah salinan cetek, yang hanya boleh menyalin jenis data asas Untuk menyalin pembolehubah ahli objek, anda perlu memanggil kaedah klon pembolehubah ahli Ini adalah cara saya memahaminya
Ia bukan salinan yang mendalam Anda boleh cuba mengklonkannya Ini bermakna String masih yang asli yang dirujuk
professor.name
与原来的professor.name
是==
Pelaksanaan lalai kaedah klon jdk ialah salinan nilai Untuk jenis asas, ia adalah nilai salinan. Untuk rujukan, ia adalah alamat yang ditunjukkan oleh rujukan salinan.
Jadi jika tiada kod
o.p=(Professor)p.clone();
, maka p objek asal dan objek klon merujuk kepada objek Profesor yang sama, iaitu salinan cetek.