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) throwsddeeException(IOException的子類),但是不可以是public void do(int i,double d) throwsException,因為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 20Inside test(double) a: 88Inside 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 的自動轉換才會起作用,而且總是找到參數類型最"匹配"的方法,即它的形參比實參“大”且是最“接近”的。
本文出自 “子 孑” 博客,請務必保留此出處http://zhangjunhd.blog.51cto.com/113473/20373