cari

Rumah  >  Soal Jawab  >  teks badan

Soalan mengenai salinan dalam java

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_leeringa_lee2774 hari yang lalu501

membalas semua(4)saya akan balas

  • 巴扎黑

    巴扎黑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);

    balas
    0
  • 淡淡烟草味

    淡淡烟草味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

    balas
    0
  • 天蓬老师

    天蓬老师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==

    balas
    0
  • 淡淡烟草味

    淡淡烟草味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.

    balas
    0
  • Batalbalas