请原谅我,如果这是重复的话,我似乎无法找到解释我所看到的东西的任何东西。
以下计划:
Object a = new Object();
Object b = a;
System.out.println( "a: " + a );
System.out.println( "b: " + b );
a = null;
System.out.println( "a: " + a );
System.out.println( "b: " + b );
产生这个:
a: java.lang.Object@3e25a5
b: java.lang.Object@3e25a5
a: null
b: java.lang.Object@3e25a5
但为什么?!?我对此感到困惑。 “b”不应该引用“a”吗?因此,如果“a”不再引用任何其他内容(例如:null),那么不应该“b”?我显然在这里缺少一些基本的东西。
提前致谢。
编辑#1
我想是什么让我失望的是我打印出来的地址。出于某种原因,在我看来,我打印出一些指示指针\引用的神奇值 - 当实际设置b = a
没有使它们相同时,它只是创建一个指向同一位置的新指针堆。我希望这有助于其他人。
答案 0 :(得分:8)
b
未引用a
它引用同一对象a
引用执行分配时引用的int someNum = 5;
int * a = &someNum; // a points to someNum
int * b = a; // b points to someNum too
a = NULL; // a doesn't point to anything (points to address 0), b still points to someNum
。
我知道这不是同一种语言,但如果你熟悉 C ,就像是:
{{1}}
(我使用了C,因为它更清晰地显示了地址和参考资料)
答案 1 :(得分:4)
让我们详细了解一下发生了什么:
//A is pointing to a new Object lets assume memory location for 1 for simplicity
Object a = new Object();
//B is now also pointing to memory location 1
Object b = a;
//Both print the same they are both pointing to memory location 1
System.out.println( "a: " + a );
System.out.println( "b: " + b );
//a is now pointing to null, but there is no change to b which is still pointing to memory location 1
a = null;
System.out.println( "a: " + a );
System.out.println( "b: " + b );
答案 2 :(得分:3)
Java总是按值传递,就是全部。
答案 3 :(得分:2)
Object a = new Object();
此行在堆上创建一个新对象,并在变量a
中放置一个引用。
Object b = a;
Java是按值传递的,因此该行传递/将该引用的值分配给变量b
。
a = null;
这意味着变量a
不应再指向堆上的那个位置,而应该指向哪里。但它并不意味着b
无处可去,因为我们通过值传递了引用,因此b
仍指向堆上的该对象。
这里的关键观察是传值。由于基本上我们将a
的值复制到b
,因此更改原件不会影响复印件的外观,因为它已经被拍摄。
答案 4 :(得分:1)
a和b都是对您创建的Object实例的引用。这意味着两者都指向相同的内存区域。然后你销毁其中一个引用。现在指向null。但是对象和第二次引用它都是活着的。这就是你所看到的。
答案 5 :(得分:1)
引用新对象(Object a = new Object()
)
b引用与(Object b = a
)相同的对象
没有引用(a=null
)
b仍引用Object
答案 6 :(得分:0)
null
不是原始的,它被视为对象,因此当您致电a = null
时,a
将引用任何内容,而b
仍引用相同的对象{{ 1}}