Java的重寫和重載是兩種在Java中經常提到的兩組概念,它們在各個方面都有着很大的不同,下面詳細介紹你要了解的區別。
Java的多態機制
即重寫,重寫主要用於子類和父類之間,在父類中定義了一個方法,同時在子類中對這個方法進行重寫,實現子類行為的特殊化,例如:
1 class Animal{ 2 void eat(){ System.out.print("animal eat");} 3 } 4 5 class Tiger extends Animal{ 6 void eat(){System.out.print("Tiget eat");} 7 }
子類中的eat方法即對父類的eat方法實現了重寫,重寫最常見的例子就是下面的聲明:
Animal some=new Tiger();
關於重寫,遵循以下的規則:
(1)重寫方法必須和被重寫方法具有相同的參數列表,返回類型必須和被重寫方法的返回類型相同或者是返回類型的子類型。
(2)重寫方法的訪問控制修飾符不能比被重寫方法更嚴格(比如一個在父類中聲明為public的方法重寫成一個protected的方法)。
(3)只有實例方法才能被重寫,超類中的final方法不能被重寫。
(4)重寫方法不能拋出新的檢查異常,或者是拋出比被重寫方法聲明的檢查異常更廣泛的檢查異常。
(5)注意一種特殊情況:如果超類的方法版本中聲明了檢查異常,但重寫的子類方法中沒有聲明,這時如果使用多態的方式進行調用,那么編譯器認為你調用的是聲明了異常的方法。
(6)盡管多態是在編譯時確定對象的類型,但在編譯時,還是根據父類的方法聲明進行程序檢查。因此,如果子類中定義的方法,在父類中沒有定義,則會出項編譯錯誤。
Java的重載機制:
重載的實質:在一個類中使用簽名相同的多個方法。
按照范圍,可以將重載分為在一個類中重載,和在子類和父類中重載。現分別解釋如下:
1.在一個類中定義多個具有相同簽名的方法,這些方法必須具有不同的參數列表,比如一個類的構造函數。
2.在父類和子類中,子類由於繼承而擁有了父類的某些方法,此時在子類再定義具有相同簽名的方法(必須具有不同的參數列表),這個地方很容易和重寫相混淆,因此千萬注意。
重載的規則主要記住亮點:
一是方法的參數列表必須改變,包括參數的類型,參數的個數多少,參數順序。
二是重載對返回類型,訪問修飾符,異常聲明沒有任何限制,可以作任意的修改。實質上,重載只是創建了一個方法而已,特殊的地方在於方法的名字。
注意下面的一種情況:(重寫和重載的混合)
class UseAnimal{ void doStuff(Animal sa){} void doStuff(Tiger sa){} public static void main(String[] args){ UseAnimal ua=new UseAnimal(); Animal an=new Tiger(); ua.duStuff(an); } }
此時,調用的方法doStuff的Animal版本,因為調用重載方法是在編譯時決定的,an的聲明類型是Animal。所以調用Animal版本。
始終注意一點:重載的判斷始終是在編譯時決定
