構造器的繼承

在java中,經常使用到繼承,子類從父類中繼承可繼承的域和方法。而關於構造器的構造器卻和一般的繼承有很大不同。以下面爲例。 
Java代碼  收藏代碼
  1. package Thinking;  
  2. public class Father{  
  3.     public int n;  
  4.       
  5.     public Father(int n){     
  6.         this.n=n;  
  7.     }  
  8.       
  9.     public Father(String msg){  
  10.         System.out.println(msg);  
  11.     }  
  12.   
  13. }  
  14. class Son extends Father{  
  15.     public Son(String msg){   //編譯無法通過  
  16.         System.out.println(msg);  
  17.     }  
  18. }  

    上述代碼中,Son是Father的子類,父類有兩個構造函數,一個參數爲int,一個參數爲String,而Son的構造函數和父類第二個構造函數一樣。然而Son卻無法通過編譯,這是因爲子類的構造器重隱含着對父類無參構造器的調用,若父類沒有無參構造器,那子類必須在構造器中顯式調用父類的其中一個有參構造器,否則無法通過編譯。 
    所以上述代碼中,可以有兩種解決辦法。一是在父類添加一個無參構造器,二是在子類中添加一個對父類構造器的顯示調用(super(param))。這樣纔可通過編譯。 
    方法一: 
Java代碼  收藏代碼
  1. package Thinking;  
  2. public class Father{  
  3.     public int n;  
  4.       
  5.     public Father(){  
  6.         System.out.println("Father");  
  7.     }  
  8.     public Father(int n){     
  9.         this.n=n;  
  10.     }  
  11.       
  12.     public Father(String msg){  
  13.         System.out.println(msg);  
  14.     }  
  15.   
  16. }  
  17. class Son extends Father{  
  18.     public Son(String msg){  
  19.         System.out.println(msg);  
  20.     }  
  21. }    

方法二: 
Java代碼  收藏代碼
  1. package Thinking;  
  2. public class Father{  
  3.     public int n;  
  4.       
  5.       
  6.     public Father(int n){     
  7.         this.n=n;  
  8.     }  
  9.       
  10.     public Father(String msg){  
  11.         System.out.println(msg);  
  12.     }  
  13.   
  14. }  
  15. class Son extends Father{  
  16.     public Son(String msg){  
  17.         super(msg);  
  18.         System.out.println(msg);  
  19.     }  
  20. }  

    此外當父類沒有無參構造器時,子類無法使用系統默認的構造器,必須創建自己的構造器,無論是否有參數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章