2017-02-14 13 views
3

我在瀏覽網頁時,希望找到能夠幫助我構建HuffmanTree的東西,並偶然從http://rosettacode.org/wiki/Huffman_coding#Java中找到了此代碼。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的一個對象),如果我編寫(樹的instanceof HuffmanLeaf)它返回false(邏輯)。
但是,爲什麼樹(TreeFieldofHuffmanNode)在樹是HuffmanNode的父節點時返回true?

+0

'tree'對象可能有'HuffmanTree'的靜態類型,但不能是它的動態類型(這是'instanceof'使用的),因爲'HuffmanTree'是'abstract'。 –

+0

請注意這種模式。這是遞歸定義激發思想的巨大力量。二叉樹中的每個節點本身都是二叉樹,因爲它有兩個子節點。葉節點只是一個沒有孩子(尚)的樹。因此,樹中的每個節點同時是一個節點(它擁有一個值)和一棵樹。很大一部分軟件開發(甚至是數學)都在這個基礎上。 –

+0

但是,'instanceof'是一種代碼味道,常常被用來代替正確的類型分類。 –

回答

3

從邏輯上說,Tree只是一個Node,兩個Tree引用作爲孩子。

當樹是HuffmanNode的父項時,爲什麼(tree instanceof HuffmanNode)返回true?爲什麼?!

tree必須是HuffmanNode(如你看到的),是的,任何HuffmanNode是其他兩個HuffmanTree實例(其本身可以是節點或葉)的母公司。

HuffmanNodeHuffmanTree

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

這就解釋了......

當你寫(樹的instanceof HuffmanNode)

然而,不知道這

...

樹是類HuffmanTree

因爲HuffmanTreeabstract的對象,這意味着它必須聲明如下方式,因爲你不能new一個抽象的實例

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

(就我個人而言,我將葉節點作爲具有兩個子樹的節點)

+0

有趣......但是我不明白抽象類是如何工作的或者爲什麼它們被使用(應該可以讀到)。如果HuffmanTree類不是抽象的,那麼聲明是否會返回true?還發現您的帖子底部的代碼很有趣。如果前面的語句(在「tree」之前)說它應該是/是HuffmanTree類型的,那你怎麼能把它聲明爲「new HuffmanNode()」? – Schytheron

+0

是的,請閱讀'abstract'。有足夠的資源來幫助你。抽象不控制'instanceof'的返回值,然後''extends''關鍵字。我的觀點是,你不能'new'任何'抽象類',因此它**必須在你的問題中沒有顯示的代碼中使用新的HuffmanNode()。希望這些幫助http://stackoverflow.com/a/9552547/2308683和http://stackoverflow.com/questions/11007459/why-assign-a-new-arraylist-to-a-list-variable –