2015-11-21 57 views
1

我有延伸的具體類Actor一個抽象類MousableActor即使我的抽象類具有受保護的構造函數,爲什麼會創建默認構造函數?

public abstract class MousableActor extends Actor 
{ 
    /** 
    * Constructs a MousableActor. 
    */ 
    protected void MousableActor() 
    { 
    } 
} 

當我看到該類生成javadoc的,我看到一個公共的無參數的構造: described in text

根據Section 8.8.9 of the JLS

如果一個類不包含構造函數聲明,那麼默認的構造函數沒有形式參數也沒有引發子句是隱式聲明的。

我一直認爲if-and-only-if。爲什麼即使我明確聲明瞭一個受保護的構造函數,也會創建一個公共的默認構造函數?它與the superclass有一個公共的無參數構造函數有關嗎?

我在Java 1.8.0之上使用Greenfoot版本2.4.2(這應該不重要)。

+3

如果您使用過良好的IDE,它會告訴您存在問題,例如Eclipse顯示警告「此方法具有構造函數名稱」。 – Andreas

+1

好的和明確的問題,很多努力,雖然解決方案有點尷尬:) – zapl

+1

@zapl謙遜的教訓對我這樣的CS教授來說總是有益的。我的學生喜歡聽到我的錯誤,這讓他們感覺更好。 –

回答

5

構造函數不是void方法。

protected void MousableActor() 

應該

protected MousableActor() 
+0

D'oh!我沒有意識到一種方法可能與構造函數具有相同的名稱,而不是我意識到輸入了「void」。 –

2

因爲它返回void,它不是一個構造函數;這是一種方法,所以沒有構造函數,並且創建了默認的構造函數。

如果您打算將其作爲構造函數,請刪除void

相關問題