前面已經提過,執行子類別的建構元之前,會先呼叫父類別的建構元,以便進行初始化的動作。但是如果父類別有數個建構元時,要如何才能呼叫父類別中特定的建構元呢?這時候就要透過"super()"才能呼叫。
class Test{
private int height = 10;
private int width;
public Test{ //父類別裡沒有引數的建構元
...
}
class Test(int w){ //父類別裡有一個引數的建構元
...
}
...
class lala extends Test{
public lala(){
...
}
public lala(int w,int v){ //子類別裡有兩個引數的建構元
super(w); //呼叫父類別哩,有引數的建構元
...
}
}
}
特別注意到:呼叫父類別建構元的super()必須寫在子類別建構元裡的第一個敘述,不能放在其他地方,否則會出現編譯錯誤的訊息。
super()可以多載,也就是說,super()可以根據引數的數量及型態,執行相對應的父類別建構元。
this()與super()比較
-相異處
this()是在同一類別內呼叫其他的建構元。
super()則是從子類別的建構元呼叫其父類別的建構元。
-相似處
當建構元有多載時,this()與super()均會根據所給予的引數型態與個數,正確的執行相對應的建構元。
this()與super()都必須鑽寫在建構元內的第一行,也就是因為這樣,所以this()與super()沒有辦法同時出現在同一個建構元內。
保護成員
從前面的例子可以看到,lala是由Test繼承而來,但是因為在Test中我們把變數宣告成private,那要如何讓子類別做使用呢?這時候只要把變數宣告成保護成員(protected member)就可以了!
class Test{
protected int height = 10; //將height宣告成protected
protected int width; //將width宣告成protected
public Test{
...
}
class Test(int w){
...
}
...
class lala extends Test{
public lala(){
...
}
public lala(int w,int v){
width = w; //在子類別裡可直接取用父類別裡的protected成員
...
}
}
}
把成員宣告成protected的最大好處是,可同時兼顧到成員的安全性與便利性。
菜鳥工程師也有分享食記,歡迎大家追蹤喔~~
https://instagram.com/engineer_bodyfat?utm_medium=copy_link
今天星期五啦啦啦啦啦~~
下禮拜中秋連假!!
準備放假囉~
See U tomorrow