java空引用复制
原谅我,如果这是一个复制品,我似乎找不到任何解释我所看到的东西 以下节目:java空引用复制,java,reference,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 );
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
并不能使它们保持相同,它只是创建一个指向堆上相同位置的新指针。我希望这对其他人有所帮助。b
不是指a
它指的是执行分配时所指的同一对象a
我知道这不是同一种语言,但如果您熟悉C,它就像:
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,因为它可以更清晰地显示地址和引用)a和b都是对您创建的对象实例的引用。这意味着两者都指向相同的内存区域。然后销毁其中一个引用。现在a指向null。但是对象和对它的第二个引用b都是活动的。这就是你看到的 让我们详细看看发生了什么:
//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 );
a引用一个新对象(对象a=new Object()
)b引用与a相同的对象(
对象b=a
)a不引用任何内容(
a=null
)b仍然引用该对象
Object a = new Object();
此行在堆上创建一个新对象,并将引用放入变量a
Object b = a;
Java是按值传递的,因此此行将该引用的值传递/分配到变量b
a = null;
这意味着变量a
不应该再指向堆上的那个位置,而应该不指向任何地方。但这并不意味着b
没有指向任何地方,因为我们通过值传递引用,所以b
仍然指向堆上的那个对象
这里的关键观察是传递值。由于本质上我们将
a
的值复制成b
,更改原件不会影响影印效果,因为它已经被复制了。Java总是按值传递,就是这样。null
不是前置的,它被视为对象,所以当调用a=null
时,a
将不引用任何内容,而b
仍引用同一对象新对象()
谢谢。迄今为止最清楚的解释是——我知道我遗漏了一些相当明显的东西;或者也许我需要一个复习,DOH!