鍍金池/ 教程/ Java/ Java方法覆蓋教程
Java參數(shù)傳遞
Java靜態(tài)內(nèi)部類
Java final關(guān)鍵字
http://www.yiibai.com/java_object_oriented_design/java_inheritan
Java泛型類
Java標(biāo)準(zhǔn)注解
Java接口教程
Java注解
Java枚舉類型
http://www.yiibai.com/java_object_oriented_design/java_class_ins
Java接口實(shí)現(xiàn)
Java哈希編碼
Java泛型約束
http://www.yiibai.com/java_object_oriented_design/java_import.ht
Java注解默認(rèn)值
Java異常拋出
Java不可變對(duì)象
Java類基礎(chǔ)
Java接口繼承
Java類方法
Java訪問級(jí)別
Java對(duì)象克隆
Java初始化塊
Java可變長度參數(shù)
Java接口字段
Java對(duì)象相等比較(Equals)
Java實(shí)例和靜態(tài)方法
Java繼承方法隱藏(覆蓋)
Java面向?qū)ο笤O(shè)計(jì)
Java對(duì)象finalize()方法
Java抽象類和方法
Java Object類
Java泛型方法和構(gòu)造函數(shù)
Java枚舉體
Java接口方法
Java this關(guān)鍵字
Java注解類型的限制
Java main()方法
Java Enum類
Java注解用法
Java枚舉比較
Java注解類型
Java內(nèi)部類成員
Java繼承和構(gòu)造函數(shù)
Java類實(shí)例化
Java內(nèi)部類類型
Java對(duì)象toString()方法
Java finally塊
Java繼承教程
Java自定義異常
Java枚舉值
Java接口作為類型
Java異常類
Java方法覆蓋教程
http://www.yiibai.com/java_object_oriented_design/java_class_bas
Java枚舉方法
Java方法重載
http://www.yiibai.com/java_object_oriented_design/java_interface
Java異常用法
Java內(nèi)部類
Java類成員訪問級(jí)別
Java異常處理教程
Java注解反射
Java構(gòu)造函數(shù)(構(gòu)造器)
Java導(dǎo)入(import語句的用法)

Java方法覆蓋教程

方法覆蓋

重新定義來自超類(父類)繼承的類中的實(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()方法覆蓋類Aprint()方法。

如果一個(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í)別 允許覆蓋方法訪問級(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

上一篇:Java main()方法下一篇:Java初始化塊