有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这里有一个例子来说明我的意思

如果我有一个接受节点的二叉树插入方法,并将其传递给父节点。孩子(未经证明)到底传递了什么

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

不幸的是,我没有任何代码,因为这实际上是一个传递给我的问题,我不能很好地把它放在一起。我的解决方案是传递一个已经实例化的父节点,然后实例化父节点。孩子


共 (1) 个答案

  1. # 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
    

    回答你的问题

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

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