2013-10-31 23 views
2

我已經四處尋找這個問題的答案,但到目前爲止我還沒有明白這一點。我有3個Java類,BinaryTree和HuffmanTree(它擴展了BinaryTree)和HuffmanData(在HuffmanTree中使用,與此問題無關)爲什麼這個Java代碼中的子類有一個默認的構造函數,如果超類沒有?

HuffmanTree在其構造函數中顯式調用super()。我無法理解的是爲什麼它包含對默認構造函數的調用?超類BinaryTree根本沒有默認的構造函數,所以根據我的理解,代碼應該拋出一個Exception,但它不會。

下面是二叉樹代碼:

public class BinaryTree { 
    private Comparable data; 
    private BinaryTree left; 
    private BinaryTree right; 
    public final static BinaryTree NIL = new BinaryTree(null, null, null); 

    // Constructor 1 
    public BinaryTree (Comparable data, BinaryTree left, BinaryTree right) { 
     this.data = data; 
     this.left = left; 
     this.right = right; 
    } 

    // Constructor 2 
    public BinaryTree (Comparable data) { 
     this(data, BinaryTree.NIL, BinaryTree.NIL); 
    } 
    . 
    . 
    . // other methods 
} 

這裏是HuffmanTree代碼:

public final class HuffmanTree extends BinaryTree implements Comparable { 
    private String[] table; 
    private static final int NUM_CHARS = 256; 
    private static final HuffmanTree NIL = new HuffmanTree(); 
       // Calls default constructor in this class, but how does it work? 

    // Constructor 1 --- what does this do?? 
    private HuffmanTree() {} 

    // Constructor 2 
    private HuffmanTree (char c, int f) { 
     super(new HuffmanData(c,f), NIL, NIL); 
    } 

    // Constructor 3 
    private HuffmanTree (HuffmanTree left, HuffmanTree right) { 
     super(new HuffmanData((char)0, left.frequency()+right.frequency()), 
               left, right); 
    } 
    . 
    . 
    . // other methods 
} 

道歉,如果這個問題還不清楚。請讓我知道我如何能更好地解釋它。

回答

-1

私有無參數構造函數除了導致編譯錯誤外沒有任何其他用處。看起來像有人試圖通過將其設置爲私有而使其不可用,但其他構造函數的存在已經阻止編譯器生成默認構造函數。

我不知道你爲什麼認爲會拋出一個異常,除非你混淆了異常和編譯錯誤。編譯錯誤不是例外情況,而是打印出來,而不是拋出。

+0

這並不意味着爲什麼不引發異常。 –

+0

你是什麼意思由super()調用沒有任何用處..?編譯器會爲您插入一個無參的超級調用,如果您的超類沒有任何無參數構造函數,則會導致編譯時錯誤。 –

-3

在Java中,默認構造函數是由JVM自動創建的,無論您是否寫它。所以在你的BinaryTree類的代碼中默認構造函數是自動創建的,當HuffmanTree的對象調用默認構造函數時,它會調用BinaryTree的默認構造函數。

+0

如果您不提供任何其他構造函數,第一句只是正確的。 – EJP

2

這個我的朋友會產生編譯器錯誤no suitable constructor found for BinaryTree()

只有當您沒有爲類提供任何構造函數時,纔會爲類創建默認無參數構造函數。如果你爲這個類提供了一個構造函數,那麼你必須自己創建一個無參數構造函數。

JLS指出

這是一個編譯時錯誤,如果默認的構造函數是隱式聲明,但超類沒有可訪問的構造函數(6.6節),它沒有參數,也沒有throws子句。

+0

這是否意味着一旦你提供了一個默認的ctor,Object上的無參數構造函數就會被遮擋? 。 。 (從我完成Java開始已經有幾年了 - 一定會生鏽!) –

+1

當您爲您的類創建構造函數時,編譯器不會插入任何默認的無參數構造函數。但是編譯器所做的是通過在構造函數中插入'super()'來調用超類的構造函數,只要不擴展任何其他沒有無參數構造函數的類。 –

+0

儘管我同意你的回答,但你的JLS報價不適用於這種情況。「HuffmanTree」的默認構造函數不是*隱式*聲明的,它是*顯式聲明的。 – Francis

相關問題