覆蓋與重載
覆蓋和重載在Java中是兩個非常重要的概念辣往。經常在Java新手中引起困惑。這篇文章通過兩個例子來闡明它們之間的區(qū)別殖卑。
1.定義
在一個類里面有兩個或更多的方法站削,方法名相同,參數不同孵稽,這叫做重載许起。
覆蓋以為著兩個方法具有相同的方法名和參數。一個方法在父類里面菩鲜,另一個在子類里面园细。覆蓋準許子類提供一個已經在父類中提供的存在的特定方法實現。
2.覆蓋和重載
這里有關于覆蓋和重載的重要事實:
1)在運行中接校,通過實際對象的類型而不是引用變量類型來決定哪個覆蓋的方法被使用珊肃。相比之下,引用類型在編譯的時候就決定哪些方法被使用馅笙。
2)多態(tài)適用于覆蓋而不是重載。
3)覆蓋是運行時候概念厉亏,而重載是編譯時的概念董习。
3.一個覆蓋的例子
下面是一個覆蓋的離職,讀完代碼后猜猜輸出結果爱只。
class Dog{
public void bark(){
System.out.println("woof ");
}
}
class Hound extends Dog{
public void sniff(){
System.out.println("sniff ");
}
public void bark(){
System.out.println("bowl");
}
}
public class OverridingTest{
public static void main(String [] args){
Dog dog = new Hound();
dog.bark();
}
}
輸出:
bowl
在上面的例子中皿淋,dog變量被聲明為Dog類型,在編譯中,編譯器檢查Dog類有個bark()
方法窝趣,代碼就編譯了疯暑。在運行的時候,一個 Hound
對象被創(chuàng)建賦值給了dog. JVM知道哑舒,變量dog實際指向的對象是Hound
,所以它調用Hound
的bark()
方法妇拯。這被稱為動態(tài)多態(tài)性。
4.一個重載的例子
class Dog{
public void bark(){
System.out.println("woof ");
}
//overloading method
public void bark(int num){
for(int i=0; i<num; i++)
System.out.println("woof ");
}
}
在重載的例子中洗鸵,可以通過不同的參數來調用兩個bark
方法越锈。編譯器知道它們是不同的,因為他們有不同的方法簽名(方法名和參數列表)膘滨。
參考文獻:
1)定義方法甘凭。 本教程來自Oracle,它解釋了方法的組件火邓,以及編譯器使用哪些組件來區(qū)分方法丹弱。