我对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
的引用相同?
答案 0 :(得分:2)
首先,new Object(o.getInnerObject())
将无法编译,因为Object
没有匹配的构造函数。
假设您将其替换为new OuterObject (o.getInnerObject());
,OuterObject
的新实例将包含InnerObject
包含o
的相同实例,因为OuterObject
的构造函数}不会创建传递给它的InnerObject
实例的副本。
答案 1 :(得分:2)
您获得的对象数量与使用new
关键字创建的对象相同。
答案 2 :(得分:2)
如果将对象存储在变量或参数中,则始终存储引用。永远不会复制该对象。仅复制原始类型,例如int
或boolean
。
如果要创建对象副本,则应使用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引用。