【问题标题】:Java: How does passing uninstantiated object references work?Java:传递未实例化的对象引用如何工作?
【发布时间】:2015-01-15 01:48:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我不确定你的意思。但是任何引用,无论是实例成员、静态成员还是局部变量,都会自动初始化为null,直到您为其分配其他内容。如果将其作为参数传递,则参数将为null
  • 如果某些东西没有被实例化,它会被初始化为它的默认值。布尔值为 False,大多数其他基元为 0,引用类型为 null。所以是的,你将传递一个指向 null 的指针。

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


【解决方案1】:

这是一个例子。考虑类型

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

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

回答你的问题

这是否意味着我传递了一个与 父节点?

您正在传递 null 引用。将无法从绑定参数中检索 parent 所引用的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多