public class SomeTrying{ public static void main(String[] args){ new Son(); new Son().Father(); } } class Father{ //父類Father的無參構造函數 public Father (){ System.out.println("Father Construtor"); } //父類Father的帶參構造函數 ,構造函數不是成員函數,它只代表類本身,所以一個類可以有多個構造函數 public Father (int x){ System.out.println("Father Construtor " + x); } /* 父類Father的成員函數,就是類中的普通函數,所以是不可以重復的,如果再寫一個如下, * 編譯器會報 Duplicate method Father() in type Father 錯誤,原因是兩個成員函數發生了沖突。 public int Father (){ System.out.println("Father member function"); */ public void Father (){ System.out.println("Father member function"); } } //類son是繼承父類Father的子類 class Son extends Father { //在子類的構造函數中調用父類構造函數, public Son (){ super(1); System.out.println("Son Construtor"); } //重寫父類的成員函數 public void Father(){ System.out.println("Inherited Father member function."); super.Father(); } }
1、因為類中顯式的聲明了一個帶參數構造器,所以默認的構造器就不存在了,但是你在子類的構造器中並沒有顯式的調用父類的構造器(創建子類對象的時候,一定會去調用父類的構造器,這個不用問為什么),沒有顯式調用的話,虛擬機就會默認調用父類的默認構造器,但是此時你的父類的默認構造器已經不存在了,這也就是為什么父類中必須保留默認構造器的原因。
PS.應該養成良好的編程習慣,任何我們自己定義的類,都顯式的加上默認的構造器,以后更深入的學習之后,會發現有很多好處
方法重寫規則
- 參數列表必須完全與被重寫方法的相同;
- 返回類型必須完全與被重寫方法的返回類型相同;
- 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明為public,那么在子類中重寫該方法就不能聲明為protected。
- 父類的成員方法只能被它的子類重寫。
- 聲明為final的方法不能被重寫。
- 聲明為static的方法不能被重寫,但是能夠被再次聲明。
- 子類和父類在同一個包中,那么子類可以重寫父類所有方法,除了聲明為private和final的方法。
- 子類和父類不在同一個包中,那么子類只能夠重寫父類的聲明為public和protected的非final方法。
- 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
- 構造方法不能被重寫。
- 如果不能繼承一個方法,則不能重寫這個方法
參考:http://www.runoob.com/java/java-override-overload.html
http://blog.csdn.net/yuxiaohui78/article/details/43887373
http://www.cnblogs.com/by-dream/p/3967123.html