【发布时间】:2017-02-14 23:43:00
【问题描述】:
我正在浏览网页,希望能找到可以帮助我构建 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(tree 是 HuffmanTree 类的对象),如果我编写 (tree instanceof HuffmanLeaf),它返回 false(逻辑上)。
但是为什么当tree是HuffmanNode的父节点时(tree instanceof HuffmanNode)返回true?
【问题讨论】:
-
tree对象可能具有HuffmanTree的静态类型,但它不可能是动态类型(这是instanceof使用的),因为HuffmanTree是@ 987654327@. -
仔细注意这种模式。这是递归定义的巨大力量,让你大吃一惊。二叉树中的每个节点本身都是二叉树,因为它有两个孩子。叶节点只是一棵没有子节点的树(还)。因此,树中的每个节点既是一个节点(它保存一个值)又是一棵树。很大一部分软件开发(甚至数学)都建立在这个基础之上。
-
但是,
instanceof是一种代码异味,经常被用来代替正确的类型分类。
标签: java oop tree parent huffman-code