Java中,什麼是Overriding?什麼是Overloading

author: ZJ 07-3-13

1.Overriding

Overriding翻譯過來是重寫/覆蓋 它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。
重寫的主要特點是:
1)方法名必須與被重寫方法一致。

 

2)方法引數列表必須與被重寫方法一致。

 

3)返回型別必須與被重寫方法一致。

 

4重寫的方法不能降低原方法的可見度
例如:被重寫方法為protected void do(int i,double d),則重寫方法可以為protected void do(int i,double d),或者public void do(int i,double d),但是不可以是private void do(int i,double d)

 

5)不能丟擲新的異常或者更寬的異常。
例如:被重寫方法為public void do(int i,double d) throws IOException,則重寫方法可以為public void do(int i,double d) throws  IOException ,或者public void do(int i,double d) throws ddeeException(IOException的子類),但是不可以是public void do(int i,double d) throws Exception,因為ExceptionIOException的父類,比IOException更寬

 

6)被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

2.Overloading

Overloading,翻譯成過載 它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,然後再呼叫時,VM就會根據不同的引數樣式,來選擇合適的方法執行。
其特點是:
1)各過載的方法名一致。

 

2)各過載方法的引數列表不一樣(包括引數型別,引數個數,引數順序3項中的一項或多項)。

 

3)返回型別任意。(不能通過方法的返回值來區分過載方法。)

 

4)訪問控制符任意。(不能通過方法的訪問許可權來區分過載方法。)

 

5)可以任意丟擲自身的異常,而不管被過載方法。(不能通過丟擲的異常來區分過載方法。)

 

Overloading是指“Two or more methods can have the same name if they have different numbers or types of parameters and thus different signatures. ”顯然,對過載的唯一要求就是引數列表必須改變,否則就不是過載了。

3.型別轉換中的過載

在一些情況下,Java 的自動型別轉換也適用於過載方法的自變數。例如,看下面的程式:
// Automatic type conversions apply to overloading.

class OverloadDemo {

    void test() {

       System.out.println(“No parameters”);

    }

 

    // Overload test for two integer parameters.

    void test(int a, int b) {

       System.out.println(“a and b: “ + a + ” “ + b);

    }

 

    // overload test for a double parameter

    void test(double a) {

       System.out.println(“Inside test(double) a: “ + a);

    }

}

 

class Overload {

    public static void main(String args[]) {

       OverloadDemo ob = new OverloadDemo();

       int i = 88;

       ob.test();

       ob.test(10, 20);

       ob.test(i); // this will invoke test(double)

       ob.test(123.2); // this will invoke test(double)

    }

}

 

該程式產生如下輸出:

No parameters
a and b: 10 20
Inside test(double) a: 88
Inside test(double) a: 123.2

 

在本例中,OverloadDemo 的這個版本沒有定義test(int) 。因此當在Overload 內帶整數引數呼叫test()時,找不到和它匹配的方法。但是,Java 可以自動地將整數轉換為double 型,這種轉換就可以解決這個問題。因此,在test(int) 找不到以後,Java i擴大到double 型,然後呼叫test(double) 。當然,如果定義了test(int) ,當然先呼叫test(int) 而不會呼叫test(double) 。只有在找不到精確匹配時,Java 的自動轉換才會起作用,而且總是找到引數型別最匹配的方法,即它的形參比實參且是最接近的。

4.參考資料

[1]Thinking in Java 3rd
[2] OverridingOverloading
[url]http://blog.csdn.net/andyjava2006/archive/[/url]2006/09/13/1218858.aspx
[3] 徹底學習Java語言中的覆蓋和過載
[url]http://www.blog.edu.cn/user2/41584/archives/2006/1325849.shtml[/url]
[4] JAVA 方法過載
[url]http://blog.sina.com.cn/u/[/url]538402f901000685