<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # java 中的方法覆蓋 > 原文: [https://beginnersbook.com/2014/01/method-overriding-in-java-with-example/](https://beginnersbook.com/2014/01/method-overriding-in-java-with-example/) 聲明**子類**中已經存在于**父類**中的方法稱為方法覆蓋。完成覆蓋,以便子類可以將自己的實現提供給父類已經提供的方法。在這種情況下,父類中的方法稱為覆蓋方法,子類中的方法稱為覆蓋方法。在本指南中,我們將看到 Java 中的方法覆蓋是什么以及我們使用它的原因。 ## 方法覆蓋示例 讓我們舉一個簡單的例子來理解這一點。我們有兩個類:一個子類`Boy`和一個父類`Human`。 `Boy`類擴展了`Human`類。這兩個類都有一個共同的方法`void eat()`。`Boy`類給`eat()`方法賦予了自己的實現,換句話說它覆蓋了`eat()`方法。 方法覆蓋的目的在這里很清楚。`Child`類想要給出自己的實現,這樣當它調用這個方法時,就會打印出`Boy`正在吃而不是`Human`正在吃東西。 ```java class Human{ //Overridden method public void eat() { System.out.println("Human is eating"); } } class Boy extends Human{ //Overriding method public void eat(){ System.out.println("Boy is eating"); } public static void main( String args[]) { Boy obj = new Boy(); //This will call the child class version of eat() obj.eat(); } } ``` 輸出: ```java Boy is eating ``` ## 方法覆蓋的優點 方法覆蓋的主要優點是類可以為繼承的方法**提供自己的特定實現,甚至不需要修改父類代碼**。 當一個類有多個子類時,這很有用,所以如果一個子類需要使用父類方法,它可以使用它,而其他想要具有不同實現的類可以使用覆蓋功能進行更改而不觸及父類碼。 ## 方法覆蓋和動態方法調度 方法覆蓋是[運行時多態](https://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/)的示例。當父類引用指向子類對象時,則在運行時確定對覆蓋方法的調用,因為在方法調用期間,要執行哪個方法(父類或子類)由對象類型確定。在運行時解析對覆蓋方法的調用的過程稱為動態方法調度。讓我們看一個例子來理解這個: ```java class ABC{ //Overridden method public void disp() { System.out.println("disp() method of parent class"); } } class Demo extends ABC{ //Overriding method public void disp(){ System.out.println("disp() method of Child class"); } public void newMethod(){ System.out.println("new method of child class"); } public static void main( String args[]) { /* When Parent class reference refers to the parent class object * then in this case overridden method (the method of parent class) * is called. */ ABC obj = new ABC(); obj.disp(); /* When parent class reference refers to the child class object * then the overriding method (method of child class) is called. * This is called dynamic method dispatch and runtime polymorphism */ ABC obj2 = new Demo(); obj2.disp(); } } ``` 輸出: ```java disp() method of parent class disp() method of Child class ``` 在上面的示例中,使用第二個對象(`obj2`)調用 `disp()`方法是運行時多態(或動態方法調度)。 **注意**:在動態方法調度中,對象可以調用子類的覆蓋方法和基類的所有非覆蓋方法,但是它不能調用子類中新聲明的方法。在上面的例子中,對象`obj2`正在調用`disp()`。但是,如果您嘗試使用`obj2`調用`newMethod()`方法(已在`Demo`類中新聲明),那么您將使用以下消息給出編譯錯誤: ```java Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method xyz() is undefined for the type ABC ``` ## Java 中的方法覆蓋規則 1. 參數列表:覆蓋方法的參數列表(子類的方法)必須與被覆蓋方法(父類的方法)匹配。參數的數據類型及其序列應完全匹配。 2. 覆蓋方法(子類方法)的[訪問修飾符](https://beginnersbook.com/2013/05/java-access-modifiers/)不能比父類的重寫方法更具限制性。例如,如果父類方法的訪問修飾符是`public`,則覆蓋方法(子類方法)不能具有`private`,`protected`和`default`訪問修飾符,因為所有這三個訪問修飾符都比`public`更具限制性。 例如,這是**不允許**的,因為子類`disp`方法比基類(`public`)更具限制性(`protected`)。 ```java class MyBaseClass{ public void disp() { System.out.println("Parent class method"); } } class MyChildClass extends MyBaseClass{ protected void disp(){ System.out.println("Child class method"); } public static void main( String args[]) { MyChildClass obj = new MyChildClass(); obj.disp(); } } ``` 輸出: ```java Exception in thread "main" java.lang.Error: Unresolved compilation problem: Cannot reduce the visibility of the inherited method from MyBaseClass ``` 然而,這是完全有效的情況,因為公眾的限制性比受保護的要少。相同的訪問修飾符也是有效的。 ```java class MyBaseClass{ protected void disp() { System.out.println("Parent class method"); } } class MyChildClass extends MyBaseClass{ public void disp(){ System.out.println("Child class method"); } public static void main( String args[]) { MyChildClass obj = new MyChildClass(); obj.disp(); } } ``` 輸出: ```java Child class method ``` 3. `private`,`static`和`final`方法不能被覆蓋,因為它們是類的本地方法。但是,靜態方法可以在子類中重新聲明,在這種情況下,子類方法的行為會有所不同,并且與父類的相同靜態方法無關。 4. 覆蓋方法(子類的方法)可以拋出[非受檢的異常](https://beginnersbook.com/2013/04/java-checked-unchecked-exceptions-with-examples/),無論被覆蓋的方法(父類的方法)是否拋出任何異常。然而,最重要的方法不應該拋出[檢查的異常](https://beginnersbook.com/2013/04/java-checked-unchecked-exceptions-with-examples/),這些異常是新的或比被覆蓋方法聲明的異常更寬。我們將在即將到來的教程中使用示例詳細討論這個問題。 5. 覆蓋方法的綁定在運行時發生,稱為[動態綁定](https://beginnersbook.com/2013/04/java-static-dynamic-binding/)。 6. 如果一個類正在擴展[抽象類](https://beginnersbook.com/2013/05/java-abstract-class-method/)或實現[接口](https://beginnersbook.com/2013/05/java-interface/),那么它必須覆蓋所有抽象方法,除非該類本身是一個抽象類。 ## 方法覆蓋中的`super`關鍵字 [`super`關鍵字](https://beginnersbook.com/2014/07/super-keyword-in-java-with-example/)用于調用父類方法/構造函數。 `super.myMethod()`調用基類的`myMethod()`方法,而`super()`調用基類的[構造函數](https://beginnersbook.com/2013/03/constructors-in-java/)。讓我們看一下在方法覆蓋使用`super`。 我們知道我們覆蓋子類中的方法,然后使用子類對象調用該方法調用覆蓋方法。通過使用`super`,我們可以調用覆蓋方法,如下例所示: ```java class ABC{ public void myMethod() { System.out.println("Overridden method"); } } class Demo extends ABC{ public void myMethod(){ //This will call the myMethod() of parent class super.myMethod(); System.out.println("Overriding method"); } public static void main( String args[]) { Demo obj = new Demo(); obj.myMethod(); } } ``` 輸出: ```java Class ABC: mymethod() Class Test: mymethod() ``` 如您所見,使用`super`關鍵字,我們可以訪問覆蓋的方法。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看