Rumah > Soal Jawab > teks badan
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);
}
}
巴扎黑2017-05-17 10:09:33
Ini hanya nampak sebagai "salinan mendalam" di permukaan Sebenarnya, Pelajar mahupun Profesor tidak melaksanakan salinan mendalam.
Anda menambah beberapa output pada kaedah utama:
Professor p=new Professor("wangwu",50);
Student s1=new Student("zhangsan",18,p);
Student s2=(Student)s1.clone();
System.out.println(s1.p == s2.p); //false
System.out.println(s1.name == s2.name); // true
System.out.println(s1.p.name == s2.p.name); //true
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);
System.out.println(s1.name == s2.name); //true
System.out.println(s1.p.name == s2.p.name); //false
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);
淡淡烟草味2017-05-17 10:09:33
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
天蓬老师2017-05-17 10:09:33
Ia bukan salinan yang mendalam Anda boleh cuba mengklonkannya Ini bermakna String masih yang asli yang dirujukprofessor.name
与原来的professor.name
是==
淡淡烟草味2017-05-17 10:09:33
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.