Java:传递未实例化的对象引用如何工作?

时间:2014-11-18 00:47:24

标签: java tree binary-tree pass-by-value

这是我的意思的一个例子。

如果我有一个接受节点的二叉树插入方法,我将它传递给parent.child(未经实例化)究竟传递了什么?

由于Java是通过值传递的,它必须传递引用的副本但没有任何对象指向会发生什么?这是否意味着我传递了与父节点无关的空引用?

不幸的是,我没有任何代码,因为这实际上是一个传递给我的问题,我无法将它整合在一起。我的解决方案是传递已经实例化的父节点,然后实例化parent.child

1 个答案:

答案 0 :(得分:0)

这是一个例子。考虑类型

class Node {
    Node child;
}

Node parent = new Node();
// here, parent.child == null

所以,假设null是一个特殊值,比如0x0000,在内存中的某个地方(YMMV),那就是

0x1000: Start of Node Object
0x1004: 0x0000 (child field offset)
...
0x6000: 0x1000 (parent variable)

换句话说,有一个Node对象,child字段存储null作为其值。此外,还有一个变量parent存储Node对象的值(排序地址)。

当你这样做时

public void insert(Node node) {/* implementation */}
...
tree.insert(parent.child);

您要取消引用parent,从而获取其地址0x1000,确定其child字段的偏移量,0x1004,并获取其值{{ {1}}。然后,您将该值复制到堆栈上。方法调用将从堆栈中弹出该值并将其绑定到此新0x0000变量。所以现在你有了

node

回答你的问题

  

这是否意味着我传递的空引用与之无关   父节点?

您正在传递0x1000: Start of Node Object 0x1004: 0x0000 (child field offset) // null ... 0x6000: 0x1000 (parent variable) ... 0x8000: 0x0000 (node variable) // null 参考。将无法从绑定参数中检索引用的null