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