Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象之间的差异o=makeMeAnObjectPlease();对象o=新对象();_Java_Oop_Object_New Operator_Assignment Operator - Fatal编程技术网

Java 对象之间的差异o=makeMeAnObjectPlease();对象o=新对象();

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()中创建的相同的

我最近开始重构我的Java代码。一切正常,直到后来,我注意到我的一些对象丢失了“正确的引用”,即对象是“按值传递的”,而不是“按引用传递的”。请注意,我确实理解Java总是这样,而通过引用传递只是通过内存地址传递来模拟的(这就是我引用这两个短语的原因)

我的问题是:两者之间有区别吗

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