Object o = makeMeAnObjectPlease(); 之间的区别和对象 o = new Object();

Posted

技术标签:

【中文标题】Object o = makeMeAnObjectPlease(); 之间的区别和对象 o = new Object();【英文标题】:Difference between Object o = makeMeAnObjectPlease(); and Object o = new Object(); 【发布时间】:2013-01-16 06:54:08 【问题描述】:

我最近开始重构我的 Java 代码。一切都运行良好,直到后来,我注意到我的一些对象丢失了“正确引用”,即对象被“按值传递” ,而不是“通过引用传递”。请注意,我确实了解 Java 始终是 pass-by-value,并且通过引用传递仅通过内存地址传递来模拟(这就是我引用这两个短语的原因)。

我的问题是:有没有区别

Object o = new Object();

Object o = makeMeAnObjectPlease();

在哪里

public Object makeMeAnObjectPlease()

    Object c = new Object();
    return c;

通过差异,我的意思是oObject o = makeMeAnObjectPlease() 之后会引用与makeMeAnObjectPlease() 内部创建的内存地址相同的内存地址吗?还有其他区别吗?

【问题讨论】:

您可能想查看这个问题的答案:***.com/questions/40480/is-java-pass-by-reference 【参考方案1】:

是的,它将引用同一个对象。不,没有其他区别。进一步举例:

Date d = makeMeAnObjectPlease();
System.out.println(d);
Date d2 = d;
changeMyObjectPlease(d2);
System.out.println(d);
System.out.println(d2);

Date makeMeAnObjectPlease() 
    return new Date();


void changeMyObjectPlease(Date date) 
    date.setTime(1234);

该代码中只有一个 Date 对象,尽管它在不同时间有不同的名称。最后,所有的名字都指向同一个对象,因此最后,当我们用两个不同的名字打印出对象时,你会看到它们实际上表示内存中的同一个对象,这是由@987654322修改的@ 方法。上面运行的一个例子是:

Thu Jan 31 19:29:29 CST 2013
Wed Dec 31 18:00:01 CST 1969
Wed Dec 31 18:00:01 CST 1969

【讨论】:

我接受这个作为答案,因为他的例子确实清除了它。 :D【参考方案2】:

这两种方法在功能上没有区别。

在第一个示例中,创建了一个new Object,并将对象的引用位置存储在Object 引用变量o 中。

在第二个示例中,c 发生相同的过程。然后将c 的值(对创建对象的内存引用)复制到o 中。如果此时co 都在范围内,则对o 所做的任何更改(通过调用方法或更改字段)都将反映在c 中,反之亦然。

要回答有关参考如何在 java 中工作的问题,请考虑以下几点:

Object o,c;
o = c = new Object();

在此示例中,oc 具有相同的值(对 Object 的引用)并指向同一个对象。我可以将o 传递给一个方法,改变它指向的对象并通过从c 访问Object 来见证变化。但是,如果我将一个新对象分配给我传入的引用(如下所示)

public class Test

    public static void main(String[] args)
        Object o,c;
        o = c = new Object();
        assignIntoTheReferencePlease(c);
        System.out.println(o == c);
    

    public static void assignIntoTheReferencePlease(Object c)
        c = new Object();
    

什么都没有发生(程序打印true)。

为什么?

这是因为你说的是​​真的——所有的方法调用和返回都是按值传递。这意味着c 的引用值被复制到方法变量c 中。对该变量进行的任何赋值都不会影响外部范围内的其他变量,因为它不是真正的指针。

希望我回答了你的问题。

【讨论】:

【参考方案3】:

正如其他人所说,正如你所展示的那样,根本没有区别。唯一的区别在于可能是什么。

例如,如果您不知道/控制makeMeAnObjectPlease 的定义,它可以返回Object 的任何子类,并且代码仍然有效,而第一个选项将始终返回Object。正是由于这种抽象,第二种风格通常用于Factory Pattern

【讨论】:

【参考方案4】:

Object o = makeMeAnObjectPlease() 之后的 o 是否会引用与 makeMeAnObjectPlease() 内部创建的内存地址相同的内存地址?

我们不谈论 Java 中的内存地址。它将引用同一个对象。它怎么可能不呢?

还有其他区别吗?

只有额外的方法调用,以及其中的任何内容。

【讨论】:

“怎么可能没有?”通过 c++ 风格的复制构造。

以上是关于Object o = makeMeAnObjectPlease(); 之间的区别和对象 o = new Object();的主要内容,如果未能解决你的问题,请参考以下文章

java中的Object []和Object o是啥[关闭]

Object.defineProperty 方法

强制对象至少有一个键( Object.keys(o).length > 0 )

美团追魂七连问:关于Object o= new Object(),你能答到第几道?

SyntaxError:Object.parse(本机)AngularJS中的意外标记o

关于 CopyOnWriteArrayList remove(Object o)方法的疑问记录