Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-树是节点的实例吗?_Java_Oop_Tree_Parent_Huffman Code - Fatal编程技术网

Java-树是节点的实例吗?

Java-树是节点的实例吗?,java,oop,tree,parent,huffman-code,Java,Oop,Tree,Parent,Huffman Code,我在浏览网页,希望能找到一些东西来帮助我构建一个HuffmanTree,我偶然发现了这段代码 我是Java新手,无法使用它,因为它远高于我的水平,但我仍然对它感兴趣(因为它是如此简短且似乎有效的代码),我试图通读它,希望至少能理解其中的大部分内容(注意:我失败了)。 但是有一段代码引起了我的注意:“instanceof”方法 我的代码中有3个类。 一个超类(HuffmanTree)和两个子类(HuffmanNode和HuffmanLeaf),如下所示: abstract class Huffma

我在浏览网页,希望能找到一些东西来帮助我构建一个HuffmanTree,我偶然发现了这段代码

我是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;
    }
}
抽象类HuffmanTree实现了可比较的{
public final int frequency;//此树的频率
公共赫夫曼树(intfreq){frequency=freq;}
//频率比较
公共整数比较(HuffmanTree树){
返回频率-tree.frequency;
}
}
类HuffmanLeaf扩展了HuffmanTree{
public final char value;//此叶表示的字符
公共哈夫曼叶(int-freq,char-val){
超级(频率);
值=val;
}
}
类HuffmanNode扩展了HuffmanTree{
公共最终HuffmanTree左、右;//子树
公共赫夫曼诺德(赫夫曼特里l,赫夫曼特里r){
超级(左频+右频);
左=l;
右=r;
}
}
我读了一些关于“instanceof”的内容,据我所知,它告诉您对象是否是某个类的实例(返回布尔值true或false)。
从逻辑上讲,父对象不能是子对象的实例

但是,当您写入(HuffmanNode的树实例)时,它返回true(tree是类HuffmanTree的对象),如果我写入(HuffmanLeaf的树实例),它返回false(逻辑)。

但是,当树是HuffmanNode的父节点时,(HuffmanNode的树实例)为什么会返回true呢?

从逻辑上讲,
只是一个
节点
,有两个
引用作为子节点

当树是HuffmanNode的父级时,(HuffmanNode的树实例)为什么返回true?为什么

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

但是
huffmanode
是一个
HuffmanTree

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

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

树对象可以具有静态类型
HuffmanTree
,但这不可能是它的动态类型(这就是
instanceof
所使用的),由于
HuffmanTree
abstract
。请注意此模式。这是一个递归定义的巨大力量,让你大吃一惊。二叉树中的每个节点本身就是二叉树,因为它有两个子节点。叶节点只是一棵没有子节点的树。因此,树中的每个节点既是一个节点(它持有一个值)又是一棵树。软件开发(甚至数学)的很大一部分是建立在这个基础上的。然而,<代码>实例< <代码>是一种代码气味,经常被用来代替适当类型的分类。有趣…然而,我不明白抽象类是如何工作的,也不明白为什么要使用它们(应该仔细阅读)。如果HuffmanTree类不是抽象的,该语句会返回true吗?我还发现你文章底部的代码很有趣。如果前面的语句(在“tree”之前)说它应该是HuffmanTree类型,那么为什么您可以将它声明为“new HuffmanNode()”?是的,请阅读
abstract
。有足够的资源来帮助你。Abstract不控制
instanceof
的返回值,而
extends
关键字则控制返回值。我的观点是,您不能
new
任何
抽象类
,因此您在问题中未能显示的代码中必须是
new HuffmanNode()
。希望这些帮助和
HuffmanTree tree = new HuffmanNode(...); 
                    ^^^^ This is the object's type