2011-11-18 45 views
2

我已經創建了兩個類StandardFamily其擴展抽象類Room,編譯Standard類我正在遇到錯誤時「不能超構造函數之前引用roomNumber被稱爲」但我不明白爲什麼,任何幫助將不勝感激。不能引用roomNumber前超構造函數被稱爲

Room

public abstract class Room 
{ 
    public int roomNumber; 
    public String roomType; 
    public boolean ensuite; 
    public boolean available; 

public Room(int roomNumber, boolean enSuite) 
    { 
     this.roomNumber = roomNumber; 
     ensuite = enSuite; 
     available = false; 
    } 
} 

Standard

public class Standard extends Room 
{ 
    private int roomNumber; 
    private int childCap; 
    private int adultCap; 



public Standard(int theNumber, int kidsCap, int adultsCap) 
    { 
     super(theNumber, roomNumber); 
     childCap = childsCap; 
     adultCap = AdultsCap; 
    } 
} 
+1

爲什麼你重新聲明標準類中的roomNumber?我認爲這是問題 – kol

+1

PS這有你可能希望清理的一些問題。標準構造函數有兩個編譯錯誤。您將roomNumber代替「enSuite」作爲參數 - 它們甚至不是同一類型。你的「ensuite = enSuite」聲明令人困惑,因爲名字不同,只有一個字母的情況,使用公共字段是一個禁忌,最後在子類中隱藏一個私有的公共字段勢必造成混淆! –

+0

謝謝你們,花了一段時間,但我明白你的意思,我已經解決了這個問題 –

回答

5

super(theNumber, roomNumber);

調用超級構造函數時,它一定是你做的第一件事。您正試圖將私人空間roomNumber作爲參數發送。

在側面註釋中,Room構造函數接受一個int和一個布爾值,而您發送兩個整數。

public Room(int roomNumber, boolean enSuite)

4
super(theNumber, roomNumber);//both are int 

當你寫這篇文章時,編譯器會爲有兩個int parameter超級構造進行搜索,但沒有這樣的構造。你的構造函數有一個int和一個Boolean

public Room(int roomNumber, boolean enSuite) 

在Java 如果父類的構造不能撥打電話,由於任何條件,那麼編譯器應該顯示爲錯誤。

JLS-8.8.7.1

在構造函數體中一個明確的構造函數調用語句可能不是指這個類中聲明的實例變量或實例方法或內部類或超類,或使用本或超任表達;否則,會發生編譯時錯誤。 因此改變你的構造函數的參數或做一個新的...

3

你引用的標準,曾經室的構造函數()已完成處理只能由JVM處理roomNumber。只有所有超類的構造函數都成功返回後,才能由JVM處理和初始化類級變量。所以,你的調用鏈是這樣的:

標準() - >間() - > [初始化室的成員變量] - >從客房()返回 - > [初始化標準的成員變量]

因此,您不能將roomNumber傳遞給Room,因爲實際上它不會存在。

相關問題