總網頁瀏覽量

2013年2月26日 星期二

super用法

super:執行程式時一個物件,指向該物件的父類別。

一、子類別在建構子中初始化時用super();呼叫父類別建構子初始化

例如:
class Human{
public Human(){
System.out.println("Hahaha");
}

public void say(){
    System.out.println("Catch a murderer");
}

}

class Detective extends Human{//繼承Human
public Detective(){
super();
/*
super指向Human物件,在這裡用super呼叫Human建構子。
這邊不寫super,系統會默默地在第一行自動補上super。所以在建立subclass物件時會呼叫superclass建構子做初始化。super必須寫在建構子的第一行,如果不寫在第一行,那麼編譯階段,物件初始化時系統會自動在建構子第一行補上super()做初始化,之後又碰上開發者自己加入的super()又一次初始化就會產生error。
*/
}

@override
public void say(){
System.out.println("Yout are the murderer");

}

public void catchmurderer(){
    super.say();
}

   
}

public class mypractice {
    public static void main(String[] args) {
    Detective conan = new Detective();  
    conan.catchmurderder();
    }
}



子類別建立物件會先呼叫父類別的建構子初始化
由上面例子Detective建立conan物件時會呼叫Human類別的建構子做初始。
其實這樣設計也符合邏輯
子類別繼承自父類別的成員函數與成員變數
兒子擁有老爸一些特徵,這些特徵在老爸出生時就決定了。
兒子出生時老爸的特徵一定先出現。


在java世界裡所有的類別都是繼承自Object這個類別
因此所有的類別宣告建構子時候,系統都會默默地補上super();
去呼叫Object的建構子做初始化。

本篇例子:Detective建立物件時會(Detictive→Human→Object)層層遞迴呼叫父類別建構子做初始化。先在Object建構子初始化,接著在Human建構子初始化,最後是在Detective初始化。



二、子類別改寫(override)父類別的method或variable後,要使用父類別的method或variable時,就用super.method();呼叫父類別的method




沒有留言:

張貼留言