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

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

这是一个例子来说明我的意思。

如果我有一个接受节点的二叉树插入方法,并且我将其传递给parent.child(未实例化),那么到底传递了什么?

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

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

最佳答案

这是一个例子。考虑类型

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,并获取其值0x0000。然后将该值复制到堆栈上。方法调用将从堆栈中弹出该值并将其绑定(bind)到这个新的 node 变量。所以现在你有了

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

回答你的问题

Does that mean I'm passing an empty reference that has no relevance to the parent node?

您正在传递一个null引用。将无法检索从绑定(bind)参数引用的任何 parent

关于Java:传递未实例化的对象引用如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26984730/

相关文章:

java - Runnable 中具有 Thread 类型的局部字段

java - 数组上的克隆方法是深拷贝还是浅拷贝?

c - 删除二叉树元素

java - 如何添加二叉树的特定部分但保持树完好无损(Java)?

c - 如何找到算术表达式中的第一个运算符?

java - JMS 与 akka 和多线程

java - 解析插件时出错,您必须为 Maven 存储库指定 URL

php - 在第一级和第二级之后不保存递归帮助更改

c++ - C++ SQL解析器到表

javascript - 如何在 Javascript DOM 中创建树结构?