重新定義來自超類(父類)繼承的類中的實(shí)例方法稱為方法覆蓋。
現(xiàn)在來看看,類A
和類B
的以下聲明,覆蓋了 print()
方法 :
public class A {
public void print() {
System.out.println("A");
}
}
public class B extends A {
public void print() {
System.out.println("B");
}
}
類B
是類A
的子類。類B
從其超類繼承print()
方法并重新定義它。類B
中的print()
方法覆蓋類A
的print()
方法。
如果一個(gè)類覆蓋了一個(gè)方法,它會(huì)影響覆蓋的類及其子類。 考慮下面的類C
的聲明:
public class C extends B {
// Inherits B.print()
}
類C
不聲明任何方法。但它繼承類B
中的print()
方法??纯聪旅娴拇a,猜想它輸出結(jié)果應(yīng)該是什么?
class A {
public void print() {
System.out.println("A");
}
}
class B extends A {
public void print() {
System.out.println("B");
}
}
class C extends B {
public void print() {
System.out.println("B");
}
}
public class Main {
public static void main(String[] args) {
// Create an object of the Manager class
A aObj = new A();
B bObj = new B();
C cObj = new C();
aObj.print();
bObj.print();
cObj.print();
}
}
執(zhí)行上面的代碼,得到以下輸出結(jié)果 -
A
B
B
注意, 類總是繼承它的直接超類的方法。
方法必須是實(shí)例方法。 覆蓋不適用于靜態(tài)方法。重寫方法必須具有與重寫方法相同的名稱。重寫方法必須具有與重寫方法相同順序的相同類型和相同數(shù)量的參數(shù)。
當(dāng)方法的參數(shù)使用通用類型時(shí),與其他方法比較時(shí)考慮將泛型類型參數(shù)的擦除。參數(shù)的名稱是無關(guān)緊要的,不會(huì)影響方法的覆蓋。
覆蓋方法的訪問級(jí)別必須至少與被覆蓋方法的訪問級(jí)別相同或更寬松。下表列出了覆蓋方法允許的訪問級(jí)別 -
覆蓋方法訪問級(jí)別 | 允許覆蓋方法訪問級(jí)別 |
---|---|
public | public |
protected | public, protected |
package-level | public, protected, package-level |
方法可以在其throws子句中包括檢查異常的列表。覆蓋方法無法向覆蓋方法中的異常列表添加新的異常。
它可以刪除一個(gè)或所有異常,或者可以用另一個(gè)異常替換異常。
從子類訪問重寫的方法。在子類中可以使用關(guān)鍵字super
作為限定符來調(diào)用超類的重寫方法。
class MySuperClass {
public void print() {
System.out.println("Inside MySuperClass");
}
}
class MySubClass extends MySuperClass {
public void print() {
// Call print() method of MySuperClass class
super.print();
// Print a message
System.out.println("Inside MySubClass.print()");
}
public void callOverridenPrint() {
// Call print() method of MySuperClass class
super.print();
}
}
public class Main {
public static void main(String[] args) {
MySubClass aoSub = new MySubClass();
aoSub.print();
aoSub.callOverridenPrint();
}
}
上面的代碼生成以下結(jié)果。
Inside MySuperClass
Inside MySubClass.print()
Inside MySuperClass