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

Copy of object by passing as method parameter

提问人:MidgarZolom 提问时间:12/8/2014 最后编辑:EranMidgarZolom 更新时间:12/8/2014 访问量:2776

问:

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

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

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

Java OOP 按引用传递 Pass-by-value 对象实例化

评论


答:

2赞 Eran 12/8/2014 #1

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

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

评论

0赞 Eran 12/8/2014
@MidgarZolom getter 不会改变我的答案(如果 getter 返回了 this.io 的副本,答案就会改变)。
2赞 iozee 12/8/2014 #2

您可以获得与使用关键字创建的对象一样多的对象。new

2赞 Nitram 12/8/2014 #3

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

如果要创建对象的副本,则应使用接口和方法或复制构造函数来研究对象克隆。你选择什么只是一个偏好问题。我通常会使用复制构造函数,因为它们可以更清楚地显示正在发生的事情。至少对我来说是这样。java.lang.CloneableClone

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

0赞 ztwgod 12/8/2014 #4

您的代码在以下行中存在编译错误: 返回 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 引用。

评论

0赞 MidgarZolom 12/8/2014
是的,我有点时间压力,我在这里打字时犯了一些错误,我希望我把它们都修好了,但我问题的本质应该很清楚并且已经回答了