Java - Is Tree是Node的一个实例吗?

时间:2017-02-14 23:43:01

标签: java oop tree parent huffman-code

我正在浏览网页,希望找到一些可以帮助我建立一个HuffmanTree的东西,我偶然发现了http://rosettacode.org/wiki/Huffman_coding#Java中的代码。

我是Java的新手并且无法使用它,因为它远远高于我的水平,但我仍然对它感兴趣(因为它是如此短而且看似有效的代码)而我试图通过它阅读希望至少要了解其中的大部分内容(注意:我失败了​​) 但有一段代码引起了我的注意:“instanceof”方法。

我的代码中有3个类 一个超类(HuffmanTree)和两个子类(HuffmanNode和HuffmanLeaf)看起来像这样:

abstract class HuffmanTree implements Comparable<HuffmanTree> {
    public final int frequency; // the frequency of this tree
    public HuffmanTree(int freq) { frequency = freq; }

    // compares on the frequency
    public int compareTo(HuffmanTree tree) {
        return frequency - tree.frequency;
    }
}

class HuffmanLeaf extends HuffmanTree {
    public final char value; // the character this leaf represents

    public HuffmanLeaf(int freq, char val) {
        super(freq);
        value = val;
    }
}

class HuffmanNode extends HuffmanTree {
    public final HuffmanTree left, right; // subtrees

    public HuffmanNode(HuffmanTree l, HuffmanTree r) {
        super(l.frequency + r.frequency);
        left = l;
        right = r;
    }
}

我读了一下“instanceof”,据我所知,它告诉你对象是否是某个类的实例(返回一个布尔值true或false)。
从逻辑上讲,父母不能是孩子的实例。

但是,当你编写(tree instanceof HuffmanNode)时,它返回true(树是HuffmanTree类的一个对象),如果我写(tree instanceof HuffmanLeaf),它返回false(逻辑上)。
但是当树是HuffmanNode的父类时,为什么(tree instanceof HuffmanNode)返回true?

1 个答案:

答案 0 :(得分:3)

逻辑上,Tree只是一个Node,其中有两个Tree个引用作为子项。

  

当tree是HuffmanNode的父级时,为什么(tree instanceof HuffmanNode)返回true?为什么呢?!

tree必须是HuffmanNode(如您所见),是的,任何HuffmanNode都是其他两个HuffmanTree实例的父级(它们本身可以是节点或树叶)。

HuffmanNode HuffmanTree

class HuffmanNode extends HuffmanTree { // <-----
    public final HuffmanTree left, right; // subtrees

哪个解释......

  

当你写(树实例为HuffmanNode)

但是,不确定这个......

  

树是HuffmanTree类的对象

因为HuffmanTree abstract ,这意味着必须按照以下方式声明它,因为您不能new抽象实例

HuffmanTree tree = new HuffmanNode(...); 
                    ^^^^ This is the object's type

(就个人而言,我的叶子类是一个有两个null子树的节点)