Java 对象之间的差异o=makeMeAnObjectPlease();对象o=新对象();
我最近开始重构我的Java代码。一切正常,直到后来,我注意到我的一些对象丢失了“正确的引用”,即对象是“按值传递的”,而不是“按引用传递的”。请注意,我确实理解Java总是这样,而通过引用传递只是通过内存地址传递来模拟的(这就是我引用这两个短语的原因) 我的问题是:两者之间有区别吗Java 对象之间的差异o=makeMeAnObjectPlease();对象o=新对象();,java,oop,object,new-operator,assignment-operator,Java,Oop,Object,New Operator,Assignment Operator,我最近开始重构我的Java代码。一切正常,直到后来,我注意到我的一些对象丢失了“正确的引用”,即对象是“按值传递的”,而不是“按引用传递的”。请注意,我确实理解Java总是这样,而通过引用传递只是通过内存地址传递来模拟的(这就是我引用这两个短语的原因) 我的问题是:两者之间有区别吗 Object o = new Object(); 及 在哪里 不同的是,我的意思是,在对象o=makeMeAnObjectPlease()之后,o会引用与在makeMeAnObjectPlease()中创建的相同的
Object o = new Object();
及
在哪里
不同的是,我的意思是,在
对象o=makeMeAnObjectPlease()
之后,o
会引用与在makeMeAnObjectPlease()中创建的相同的内存地址吗?还有什么区别吗?是的,它将引用同一个对象。不,没有其他区别。再举一个例子:
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);
}
代码中只有一个日期对象,尽管它在不同的时间有不同的名称。最后,所有名称都指向同一个对象,因此,最后,当我们用两个不同的名称打印对象时,您会看到它们实际上指示内存中的同一个对象,该对象由changeMObjectPlease()
方法修改。运行上述程序的示例如下:
Thu Jan 31 19:29:29 CST 2013
Wed Dec 31 18:00:01 CST 1969
Wed Dec 31 18:00:01 CST 1969
正如其他人所说,正如你所展示的,根本没有区别。唯一的区别在于可能发生的事情
例如,如果您不知道/控制定义makeMeAnObjectPlease
,它可以返回Object
的任何子类,代码仍然有效,而第一个选项将始终返回Object
。正是为了这种抽象,第二种风格通常用于一种抽象
对象o=makeMeAnObjectPlease()之后的o是否会引用与在makeMeAnObjectPlease()中创建的内存地址相同的内存地址
我们不谈论Java中的内存地址。它将引用同一个对象。怎么可能不呢
还有什么不同吗
只有额外的方法调用,以及其中的任何内容。这两种方法在功能上没有区别
在第一个示例中,创建了一个新对象
,该对象的参考位置存储在对象
参考变量o
中
在第二个示例中,c
也会发生相同的过程。然后将c
(创建对象的内存引用)的值复制到o
。如果此时c
和o
都在范围内,则对o
所做的任何突变(通过调用方法或更改字段)都将反映在c
中,反之亦然
请回答您关于java中引用工作的问题,请考虑以下内容:
Object o,c;
o = c = new Object();
在此示例中,o
和c
具有相同的值(对对象的引用)并指向相同的对象。我可以将o
传递到一个方法中,通过从c
访问对象来改变它所指向的对象,并见证变化。但是,如果我将一个新对象分配到传入的引用中(如下所示)
什么也没有发生(程序打印true
)
为什么?
这是因为您所说的是真的-所有方法调用和返回都是按值传递的。这意味着c
的参考值被复制到方法变量c
中。对该变量所做的任何赋值都不会影响范围外的其他变量,因为它不是真正的指针
我希望我回答了你的问题。“怎么可能?”通过C++风格的复制结构。我接受这个答案,因为他的例子已经很清楚了。DYou可能想查看此问题的答案:
Thu Jan 31 19:29:29 CST 2013
Wed Dec 31 18:00:01 CST 1969
Wed Dec 31 18:00:01 CST 1969
Object o,c;
o = c = new 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();
}
}