Java:将属性从一个对象实例复制到另一个对象实例?

Java:将属性从一个对象实例复制到另一个对象实例?,java,object,reference,deep-copy,shallow-copy,Java,Object,Reference,Deep Copy,Shallow Copy,说你有 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 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的引擎是指同一个引擎实例,还是当我执行
car2.setEngine(car1.getEngine())
时,它会自动生成car1.getEngine()的深度副本并设置为car2

没有深度复制。两个
Car
实例都引用了
Engine
的相同实例

没有深度复制。两个引用都引用同一个对象。请尝试使用==运算符比较两个对象

 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

是的,当然这些都是相同的实例。

car1------------------->eng1

car2.setEngine(car1.getEngine());
导致


car1------------------->eng1正如其他人所说,当你这样做的时候

car2.setEngine(car1.getEngine())
car2
中的
引擎
将与
car1
中的对象引用相同。使用
==
可以轻松测试这一点:

System.out.println(car2.getEngine() == car1.getEngine()); //prints "true"
当我执行
car2.setEngine(car1.getEngine())
时,它会自动生成
car1.getEngine()
的深度副本,并设置为
car2

这里要小心,因为在执行该语句时,没有对象引用的副本,它既不是深度副本,也不是浅层副本,而是同一个对象引用。这意味着,如果修改其中一辆车的发动机状态,则另一辆车的发动机将被修改(因为是相同的对象引用):


检查此处以了解如何复制对象引用:

您可以使用
=
进行测试。这是相同的实例。正如@SotiriosDelimanolis所说,您可以使用
==
轻松地测试它。如果您不是有意这样做的,它肯定不是Java中的deepcopy。听起来像是一个家庭作业/考试问题……Java总是通过值传递,也就是说,通过参数,它会复制“指向”相同值的引用。这应该称为passByValue还是passByReferende有很多讨论。Java语言引用调用它的传递值。你可以在下面阅读一篇关于这个问题的好文章,这是唯一一个详细解释为什么两辆车的发动机都是相同的对象引用的答案。谢谢你的回答。
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
}