在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,因為Exception是IOException的父類,比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
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] Overriding和Overloading
[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]538402f 901000685