相信學過Java語言的小伙伴都熟悉super這個關鍵字,接下來,我們來研究他的一些基礎用法吧。
定義名字為Father的類
package superkeyworld;public class Father {public String name;public int age;public Father() {}public Father(String name, int age) {this.name = name;this.age = age;System.out.println("父類構造方法調用了!");}public void sayHello() {System.out.println("你好,我是"+name);}
}
super關鍵字可以調用父類構造方法
當父類沒有無參構造方法的時候,子類實例化的時候,必須顯示調用父類的構造方法。
package superkeyworld;public class Child extends Father {public Child(String name, int age) {// 必須位于第一行。super(name, age);System.out.println("子類構造方法執行了");}
}
實例化Chlid類,結果如下:
父類構造方法調用了!
子類構造方法執行了!
為什么非得放在第一行?
super()之所以存在,是有很重要的原因的!因為子類與父類之間是繼承關系,而繼承就意味著得到父類中所有的成員變量和方法。既然能夠得到父類的這些成員,也就意味著子類可以訪問父類的方法和成員變量(當然,得到不意味著就可以任意使用,使用的前提是必須是有相應的訪問權限) ,如果子類在使用父類成員的時候,父類內的成員變量沒有得到正確的初始化,那么就會發生意想不到的錯誤,所以問題就出現在了這里,如何保證父類成員是安全的呢? 這就得保證父類得到了正確的初始化,而父類正確的初始化就離不開父類的構造函數,super存在的意義也正是如此。在子類的構造函數,如果沒有顯式使用super(),并且第一行沒有使用this()調用子類其他的構造函數,那么編譯器就會自動在第一行補齊super()來調用父類的默認構造函數,如果父類沒有默認的構造函數就會報錯。
super()在第一行的原因就是: 子類有可能訪問了父類的成員變量或者方法,比如在構造函數中使用父類的成員函數或者變量,在代碼塊中使用了父類的方法等, 所以為保證在子類可以訪問父類成員的正確性,所以要先完成對父類的初始化。
super關鍵字可以調用父類成員方法和成員變量(非私有)
super關鍵字可以用來訪問父類的成員方法或變量,當子類成員變量或方法與父類有相同的名字時也會覆蓋父類的成員變量或方法,這個時候要想訪問父類的成員變量或方法只能通過super關鍵字來訪問,子類方法中的super.方法名()不需要位于第一行。
package superkeyworld;public class Child extends Father {public Child(String name, int age) {// 必須位于第一行。super(name, age);System.out.println("子類構造方法執行了!");}public void sayHello() {super.sayHello();System.out.println("父親的年齡:"+super.age);System.out.println("調用父類的方法,獲取了父類的屬性!");}
}
調用子類的sayHello方法結果如下:
你好,我是feige
父親的年齡:23
調用父類的方法,獲取了父類的屬性!