通过传递方法参数复制对象

时间:2014-12-08 08:31:49

标签: java oop pass-by-reference pass-by-value objectinstantiation

我对Java在方法参数中的引用/值传递感到有点困惑。

我在OuterObject类中有一个构造函数:

private InnerObject io;
public OuterObject(InnerObject io){ 
    this.io = io;
}

public InnerObject getInnerObject(){
    return this.io;
}

如果我将OuterObject传递给这样的复制方法:

InnerObject io = new InnerObject();
OuterObject o = new OuterObject(io);    
anotherClass.getCopyOf(o);

在另一个班级:

public static OuterObject getCopyOf(InnerObject o){
    return new OuterObject(o.getInnerObject());
}

如您所见,我创建OuterObject并将InnerObject作为参数。现在我想知道:

我是否从return语句中获取了两个新对象, 或者它只是一个新的OuterObject副本,但对现有InnerObject的引用相同?

4 个答案:

答案 0 :(得分:2)

首先,new Object(o.getInnerObject())将无法编译,因为Object没有匹配的构造函数。

假设您将其替换为new OuterObject (o.getInnerObject());OuterObject的新实例将包含InnerObject包含o的相同实例,因为OuterObject的构造函数}不会创建传递给它的InnerObject实例的副本。

答案 1 :(得分:2)

您获得的对象数量与使用new关键字创建的对象相同。

答案 2 :(得分:2)

如果将对象存储在变量或参数中,则始终存储引用。永远不会复制该对象。仅复制原始类型,例如intboolean

如果要创建对象副本,则应使用java.lang.Cloneable接口和Clone方法或复制构造函数查看对象克隆。你选择的只是一个偏好的问题。我通常会复制构造函数,因为它们会更清楚地显示正在发生的事情。至少对我而言。

此外,您的第return new Object(o.getInnerObject());行无法编译。但我想你想在这里写OuterObject而不是Object

答案 3 :(得分:0)

您的代码在此行中编译错误: return new Object(o.getInnerObject()); o是Object.So的一个实例,它不能有类似getInnerObject()的方法; 此外,Object没有像Object(InnerObject)这样的构造函数。 所以,变化

public static Object getCopyOf(Object o){
    return new Object(o.getInnerObject());
}

进入

public static OuterObject getCopyOf(Object o){
    return new OuterObject(((OuterObject)o).getInnerObject());
}

我们现在可以回答你的问题。 'new'将始终在堆内存中创建一个新对象,但两个outerObject具有相同的innerObject引用。