java null引用复制

时间:2011-07-23 17:35:34

标签: java reference

请原谅我,如果这是重复的话,我似乎无法找到解释我所看到的东西的任何东西。

以下计划:

    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没有使它们相同时,它只是创建一个指向同一位置的新指针堆。我希望这有助于其他人。

7 个答案:

答案 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}}