1.定義
Overriding和Overloading對Java程式設計新手來說是兩個比較容易混淆的概念。
方法重載(Overloading)是一個類中定義了多個方法名相同,而他們的參數的數量不同或數量相同而類型和次序不同。
方法重寫(Overriding)是兩個方法具有相同的參數,但是不同的實作方式。其中一個存在于父類,另一個存在于子類。
2.重寫和重載
下面是一些關于重寫和重載重要的事實:
1.真正的對象類型,而不是引用變量的類型,決定了在運作時哪個重寫的方法被調用是在運作時使用。
2.引用類型決定哪個重載的方法在編譯時将會被調用。
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 Main{
public static void main(String [] args){
new Hound().bark();
((Dog) new Hound()).bark();
//((Dog) new Hound()).sniff();
}
}
Output?
bowl
bowl
一個更好的例子
class Animal {
void stinky() {
System.out.println("stinky animal !");
}
}
class Dog extends Animal {
public void stinky() {
System.out.println("stinky dog !");
}
public void bark() {
System.out.println("wow wow");
}
}
class Cow extends Animal {
public void stinky() {
System.out.println("stinky cow !");
}
}
public class TestOverriding {
public static void main(String[] args) {
Animal obj = new Dog();
obj.stinky();
}
}
當您建立一個對象(與上邊一樣)并調用方法:
Animal obj = new Dog();
obj.stinky();
編譯器需要做的是去檢測對象(在這裡是Animal)的類型;然後檢測方法stinky()在對象Animal中是否存在?永遠要記住,對象是在運作時建立的。是以編譯器是沒有辦法知道Dog類中的stinky()方法被調用。是以在編譯時引用變量的類類型進行檢查,來檢查這樣的方法存在與否。
現在,在運作時,JVM雖然知道對象的類類型是Animal,在運作時它指向的是Dog的對象。是以,它調用Dog類的stinky().這就是所謂的動态多态性。
相關文章:
- How Java Compiler Generate Code for Overloaded and Overridden Methods?
- An example problem of Generic types
- Type Checking for Object Oriented Features
- Deep Understanding of Arrays.sort()
原文: