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;
通过差异,我的意思是o
在Object 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
中。如果此时c
和o
都在范围内,则对o
所做的任何更改(通过调用方法或更改字段)都将反映在c
中,反之亦然。
要回答有关参考如何在 java 中工作的问题,请考虑以下几点:
Object o,c;
o = c = new Object();
在此示例中,o
和 c
具有相同的值(对 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.keys(o).length > 0 )
美团追魂七连问:关于Object o= new Object(),你能答到第几道?