0

我对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()); 
} 

正如你所看到的,我创建OuterObjectInnerObject作为参数。现在,我想知道:

我会得到两个新的对象从return语句, 或不仅是一个新的OuterObject副本,但相同的参考现有InnerObject

回答

2

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

如果要创建对象的副本,则应使用java.lang.Cloneable接口和Clone方法或复制构造函数查看对象克隆。你选择的只是一个偏好问题。我通常会在复制构造函数时更清楚地显示发生了什么。至少对于我来说。

另外你的行return new Object(o.getInnerObject());不会编译。但我想你想在这里写OuterObject而不是Object

+0

遗憾是的,我固定它 – MidgarZolom 2014-12-08 08:49:06

2

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

假设你有new OuterObject (o.getInnerObject());替换它的OuterObject新实例将包含的InnerObject相同的实例o包含,自OuterObject构造不创建InnerObject实例传递给它的副本。

+0

我添加了吸气 – MidgarZolom 2014-12-08 08:42:57

+0

@MidgarZolom,吸气不会改变我的答案(有getter返回的this.io副本,答案会改变)。 – Eran 2014-12-08 08:48:14

2

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

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()); 
 
}

我们现在可以回答你的问题。 “新”总是会创建堆内存中一个新的对象,但两人outerObjects具有相同的innerObject参考。

+0

是的,我在时间压力下一点,我在这里打字做了一些错误,我希望我固定的他们,但我的问题的实质应该是明确的,并已回答 – MidgarZolom 2014-12-08 09:19:36