2012-01-11 236 views
0
class Super { 
    protected int a; 
    protected Super(int a) { this.a = a; } 
} 

class Sub extends Super { 
    public Sub(int a) { super(a); } 
    public Sub() { this.a = 5; } 
} 




    public Sub() { this.a = 5; } 

this.a = 5不起作用。這是爲什麼?受保護的和公共的成員應該被繼承。在Java中,不能從子類訪問受保護的超類的成員

+1

看來你'Super'類只有與參數的構造函數。所以你可以在Super類中創建沒有參數的構造函數,或者用super(0)調用Super的構造函數,然後執行你的賦值。 – uthark 2012-01-11 11:44:34

+0

我明白了。但是,這種行爲的原因是什麼? – sbose 2012-01-11 11:54:16

+1

現在,如果只有編譯器會給你一些描述它所發現的錯誤的消息,這將使你不必猜測發生了什麼...... OH WAIT。它可以。請在將來閱讀錯誤消息。 – Bombe 2012-01-11 11:54:45

回答

9

的問題是不是你訪問的變量,但你不調用基類的構造:

class Super { 
    protected int a; 
    protected Super(int a) { this.a = a; } 
} 

class Sub extends Super { 
    public Sub(int a) { super(a); } 
    public Sub() { 
     super(0); // <-- call base constructor 
     this.a = 5; 
    } 
} 

這是因爲你沒有定義默認構造Super,所以派生類如果你不指定一個構造函數,不知道要調用哪個構造函數。

+1

或者甚至更好:super(5) – 2012-01-11 11:46:18

+1

@JBNizet很明顯,但我試圖說明您可以修改受保護的成員直接在派生類中。 – 2012-01-11 11:46:55

+0

@LuchianGrigore我們在同一時間回答。我想我必須刪除我的評論。 – uthark 2012-01-11 11:48:14

0

Sub你參數的構造函數試圖調用隱含參數構造函數中Super不存在,這是(我認爲)爲什麼你得到一個編譯錯誤。

0

什麼不行?適用於我...

你沒有什麼是默認的構造函數 - 在public Sub() {this.a = 5; }父調用默認構造函數,你沒有提供。如果我編譯你的代碼,我得到:

cannot find symbol constructor Super() 

所以,你要麼必須有一個默認的構造函數或做:public Sub() { super(5); }

+0

爲什麼Super()隱式調用? – sbose 2012-01-11 11:55:37

+0

通過語言設計 - 強制所有超級初始化爲新的實例。因此,如果您省略了對超類構造函數的調用,編譯器將爲您添加默認的一個。 – polve 2012-01-11 12:12:48

相關問題