iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
自我挑戰組

菜雞的JAVA日記系列 第 15

DAY15-JAVA的繼承(2)

前面已經提過,執行子類別的建構元之前,會先呼叫父類別的建構元,以便進行初始化的動作。但是如果父類別有數個建構元時,要如何才能呼叫父類別中特定的建構元呢?這時候就要透過"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


上一篇
DAY14-JAVA的繼承(1)
下一篇
DAY16-JAVA的繼承(3)
系列文
菜雞的JAVA日記30

尚未有邦友留言

立即登入留言