簡體   English   中英

Java:將屬性從一個對象實例復制到另一個對象實例

[英]Java: Copy attributes from one object instance to another?

說你有

public class Car{
  private Engine m_eng;
  public Car(){

  }

  public Engine getEngine(){
    return m_eng;
  }

  public void setEngine(Engine engine){
    m_eng = engine;
  }
}

public class Engine{
  private String m_name;
  public Engine(){};
  public Engine(String name){ m_name = name;}

  public String getName(){
    return m_name;
  }
  public void setName(String name){
    m_name = name;
  }
}

public static void main(String[] args){
  Engine eng1 = new Engine("abc");
  Car car1 = new Car();
  car1.setEngine(eng1);
  Car car2 = new Car();
  car2.setEngine(car1.getEngine());
}

問題:car1和car2的引擎是引用相同的Engine實例,還是當我執行car2.setEngine(car1.getEngine()) ,它會自動生成car1.getEnginer()的深層副本並設置為car2?

CAR 1 ---------------> ENG1

car2.setEngine(car1.getEngine());

結果是

car1 ---------------> eng1 <------------------ car2

從而指向相同的引擎實例

是的,確定這些將是同一個實例。

沒有深刻的副本。 兩個Car實例都引用相同的Engine實例。

正如其他人所說,當你這樣做時

car2.setEngine(car1.getEngine())

enginecar2將是相同的對象的引用作為car1 使用==可以輕松測試

System.out.println(car2.getEngine() == car1.getEngine()); //prints "true"

當我執行car2.setEngine(car1.getEngine()) 它會自動生成car1.getEngine()的深層副本並設置為car2

這里要小心,因為在執行該語句時沒有對象引用的副本 ,它不是深拷貝也不是淺拷貝 ,它是相同的對象引用 這意味着,如果您修改其中一輛車的引擎狀態,那么另一輛車中的引擎會被修改(因為它是相同的對象引用):

public static void main(String[] args){
    Engine eng1 = new Engine("abc");
    Car car1 = new Car();
    car1.setEngine(eng1);
    Car car2 = new Car();
    car2.setEngine(car1.getEngine());
    //additional code to show the last statement
    car2.getEngine().setName("foo");
    System.out.println(car2.getEngine().getName()); //prints "foo"
    System.out.println(car1.getEngine().getName()); //prints "foo" too
    System.out.println(eng1.getName());  //prints "foo" since it is the same object reference used from the beginning
}

請在此處了解如何制作對象引用的副本: Java:深度克隆/復制實例的推薦解決方案

沒有深刻的副本。 兩個引用都引用同一個對象嘗試使用==運算符來比較兩個對象。

 Engine eng1 = new Engine("abc");
  Car car1 = new Car();
  car1.setEngine(eng1);   //here you have set the reference eng1 which is pointing to the object abc in heap
  Car car2 = new Car();
  car2.setEngine(car1.getEngine());// here you are getting the reference of the object which is in the heap and setting it in car2 Object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM