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

3

假设你现在需要

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?


2
你可以使用 == 进行测试。 - Sotirios Delimanolis
1
它是同一个实例。正如@SotiriosDelimanolis所说,您可以使用==轻松测试它。 - Luiggi Mendoza
1
如果你没有故意这样做,那么在Java中它肯定不是深拷贝。 - Rohit Jain
听起来像是一道家庭作业/考试问题... - Crozin
Java总是按值传递,即通过参数传递时会复制指向相同值的引用。关于这是否应该称为按值传递或按引用传递存在很多讨论。Java语言参考将其称为按值传递。您可以在Java是按值传递而不是按引用传递下阅读有关此问题的好文章。 - wolfrevo
@wolfrevo 虽然这是正确的,但并不适用于 OP 所寻找的内容。请参考我的答案,更好地理解此问题中使用的“复制”一词。 - Luiggi Mendoza
5个回答

6

汽车1--------------->工程1

car2.setEngine(car1.getEngine());

结果是

汽车1--------------->引擎1 <------------------汽车2

从而指向同一个引擎实例


这是唯一一个详细解释为什么两辆车中的引擎是相同对象引用的答案。 - Luiggi Mendoza

4
是的,这些将是同一个实例。

3

正如其他人所指出的,当你执行

car2.setEngine(car1.getEngine())

car2中的engine将与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: 推荐的深度克隆/复制实例的解决方案


3

没有深复制。两个 Car 实例引用同一个 Engine 实例。


2

没有深拷贝,两个引用都指向同一个对象,尝试使用 == 操作符来比较两个对象。

 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接