Soalan mengenai salinan dalam java
ringa_lee
ringa_lee 2017-05-17 10:07:33
0
4
447

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); 
 } 
} 
ringa_lee
ringa_lee

ringa_lee

membalas semua(4)
巴扎黑

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);

淡淡烟草味

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

Peter_Zhu

Ia bukan salinan yang mendalam Anda boleh cuba mengklonkannya Ini bermakna String masih yang asli yang dirujukprofessor.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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!