我在瀏覽網頁時,希望找到能夠幫助我構建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?
'tree'對象可能有'HuffmanTree'的靜態類型,但不能是它的動態類型(這是'instanceof'使用的),因爲'HuffmanTree'是'abstract'。 –
請注意這種模式。這是遞歸定義激發思想的巨大力量。二叉樹中的每個節點本身都是二叉樹,因爲它有兩個子節點。葉節點只是一個沒有孩子(尚)的樹。因此,樹中的每個節點同時是一個節點(它擁有一個值)和一棵樹。很大一部分軟件開發(甚至是數學)都在這個基礎上。 –
但是,'instanceof'是一種代碼味道,常常被用來代替正確的類型分類。 –