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

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

我是从 return 语句中获得两个新对象,还是只是一个新OuterObject副本但对现有对象的引用相同InnerObject

4

4 回答 4

2

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

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

于 2014-12-08T08:35:43.400 回答
2

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

于 2014-12-08T08:38:02.163 回答
2

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

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

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

于 2014-12-08T08:42:48.700 回答
0

您的代码在这一行有编译错误: return new Object(o.getInnerObject()); o 是 Object 的一个实例。因此,它不能有 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' 总是会在堆内存中创建一个新对象,但是两个外部对象具有相同的内部对象引用。

于 2014-12-08T09:00:17.503 回答