- package Thinking;
- public class Father{
- public int n;
- public Father(int n){
- this.n=n;
- }
- public Father(String msg){
- System.out.println(msg);
- }
- }
- class Son extends Father{
- public Son(String msg){ //編譯無法通過
- System.out.println(msg);
- }
- }
上述代碼中,Son是Father的子類,父類有兩個構造函數,一個參數爲int,一個參數爲String,而Son的構造函數和父類第二個構造函數一樣。然而Son卻無法通過編譯,這是因爲子類的構造器重隱含着對父類無參構造器的調用,若父類沒有無參構造器,那子類必須在構造器中顯式調用父類的其中一個有參構造器,否則無法通過編譯。
所以上述代碼中,可以有兩種解決辦法。一是在父類添加一個無參構造器,二是在子類中添加一個對父類構造器的顯示調用(super(param))。這樣纔可通過編譯。
方法一:
- package Thinking;
- public class Father{
- public int n;
- public Father(){
- System.out.println("Father");
- }
- public Father(int n){
- this.n=n;
- }
- public Father(String msg){
- System.out.println(msg);
- }
- }
- class Son extends Father{
- public Son(String msg){
- System.out.println(msg);
- }
- }
方法二:
- package Thinking;
- public class Father{
- public int n;
- public Father(int n){
- this.n=n;
- }
- public Father(String msg){
- System.out.println(msg);
- }
- }
- class Son extends Father{
- public Son(String msg){
- super(msg);
- System.out.println(msg);
- }
- }
此外當父類沒有無參構造器時,子類無法使用系統默認的構造器,必須創建自己的構造器,無論是否有參數。