当我声明一个实例变量时,例如:
BSTNode node;
我知道node
现在为null,因为实例变量未初始化。但是,是否分配了一些内存以存储null
的值,node
现在是对该位置的引用?
我尝试使用
System.out.println(node);
希望我能看到引用的地址,但只看到"null"
打印出来。为什么我看不到地址?
答案 0 :(得分:3)
如果代码未显式初始化它们,则将实例变量初始化为其默认值。根据{{3}}:
,所有参考变量都初始化为null
每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10):
...
对于所有引用类型(第4.3节),默认值为null。
将null
传递给System.out.println
时,会输出字符串文字"null"
。 println
的Javadoc遵循JLS Section 4.12.5来涵盖null
传递时发生的事情:
如果参数为null,则打印字符串“null”。
没有地址,因为还没有对象。
答案 1 :(得分:1)
是的,无论初始化如何,都会分配内存并分配值。
没有“未初始化”这样的东西:显式初始化,或使用默认值初始化。
答案 2 :(得分:0)
Java没有像C / C ++这样的指针。永远不会看到对象所在的内存指针。如果你能得到它,它甚至可能因为垃圾收集可能会移动它。
如果您打印一个对象,它将成为一个字符串,调用toString()。
答案 3 :(得分:0)
“node
现在是对该位置的引用吗?”
null
如何在记忆中表现出来?
这是特定于实现的,您将无法在纯Java程序中看到null的表示。 (但是在大多数(即使不是所有Java实现)中,null都表示为零机器地址/指针。)
There is already a very detailed answer to this question in Stackoverflow: You should check it out!
另请注意video by Tony Hoare, "Null References: The Billion Dollar Mistake"。