【问题标题】:Java - Is Tree an instance of Node?Java - 树是节点的实例吗?
【发布时间】: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


【解决方案1】:

从逻辑上讲,Tree 只是一个带有两个 Tree 子引用的 Node

为什么当树是 HuffmanNode 的父节点时 (tree instanceof HuffmanNode) 返回 true?为什么?!

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

但是HuffmanNode HuffmanTree

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

这就解释了……

当你写(HuffmanNode 的树实例)

但是,不确定这个...

tree 是 HuffmanTree 类的对象

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

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

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

【讨论】:

  • 有趣...但是我不明白抽象类是如何工作的或为什么要使用它们(可能应该阅读一下)。如果 HuffmanTree 类不是抽象的,该语句会返回 true 吗?还发现您帖子底部的代码很有趣。如果前面的语句(在“tree”之前)说它应该是/应该是 HuffmanTree 类型,为什么你可以将它声明为“new HuffmanNode()”?
  • 是的,请阅读abstract。有足够的资源可以帮助您。 Abstract 不控制instanceof 的返回值,然后extends 关键字控制。我的意思是你不能new 任何abstract class,因此它必须是 new HuffmanNode() 在你没有在你的问题中显示的代码中。希望这些帮助 stackoverflow.com/a/9552547/2308683stackoverflow.com/questions/11007459/…
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 2011-09-18
  • 1970-01-01
  • 2012-12-27
  • 2023-03-26
  • 2023-03-08
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多