天天看點

Java中的方法重寫(Overriding)與方法重載(Overloading) Overriding vs. Overloading in Java

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

相關文章:

  1. How Java Compiler Generate Code for Overloaded and Overridden Methods?
  2. An example problem of Generic types
  3. Type Checking for Object Oriented Features
  4. Deep Understanding of Arrays.sort()

原文:

Overriding vs. Overloading in Java