【问题标题】:Copy of object by passing as method parameter通过作为方法参数传递对象的副本
【发布时间】:2015-02-05 21:03:56
【问题描述】:

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

如您所见,我使用InnerObject 作为参数创建了OuterObject。现在我想知道:

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

【问题讨论】:

    标签: java oop pass-by-reference pass-by-value objectinstantiation


    【解决方案1】:

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

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

    【讨论】:

    • @MidgarZolom getter 不会改变我的答案(如果 getter 返回了 this.io 的副本,答案就会改变)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        您的代码在此行中存在编译错误: 返回新对象(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' 总是会在堆内存中创建一个新对象,但是两个外层对象具有相同的内层对象引用。

        【讨论】:

        • 是的,我有点时间压力,我在这里打字时犯了一些错误,我希望我把它们都改正了,但是我的问题的本质应该很清楚并且已经回答了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2011-04-03
        • 2020-06-05
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多