1. 程式人生 > >Java中的方法重寫(Overriding)與方法過載(Overloading)

Java中的方法重寫(Overriding)與方法過載(Overloading)

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().這就是所謂的動態多型性。

相關文章:

原文: