Java中的方法重寫(Overriding)與方法過載(Overloading)
阿新 • • 發佈:2019-02-14
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().這就是所謂的動態多型性。
相關文章:
原文: