提问人:MidgarZolom 提问时间:12/8/2014 最后编辑:EranMidgarZolom 更新时间:12/8/2014 访问量:2776
通过作为方法参数传递对象的复制
Copy of object by passing as method parameter
问:
我对 Java 在方法参数中的引用传递/值有点困惑。
我在一个类中有一个构造函数:OuterObject
private InnerObject io;
public OuterObject(InnerObject io){
this.io = io;
}
public InnerObject getInnerObject(){
return this.io;
}
如果我将一个 into 一个复制方法,如下所示: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
答:
首先,不会编译,因为没有匹配的构造函数。new Object(o.getInnerObject())
Object
假设您将其替换为 ,则新实例将包含与 that contains 相同的实例,因为 的构造函数不会创建传递给它的实例的副本。new OuterObject (o.getInnerObject());
OuterObject
InnerObject
o
OuterObject
InnerObject
评论
您可以获得与使用关键字创建的对象一样多的对象。new
如果将对象存储在变量或参数中,则始终存储引用。永远不会复制对象。仅复制基元类型,例如 或。int
boolean
如果要创建对象的副本,则应使用接口和方法或复制构造函数来研究对象克隆。你选择什么只是一个偏好问题。我通常会使用复制构造函数,因为它们可以更清楚地显示正在发生的事情。至少对我来说是这样。java.lang.Cloneable
Clone
此外,您的行将无法编译。但我想你想写而不是在这里。return new Object(o.getInnerObject());
OuterObject
Object
您的代码在以下行中存在编译错误: 返回 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 引用。
评论