<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java `super` > 原文: [https://www.programiz.com/java-programming/super-keyword](https://www.programiz.com/java-programming/super-keyword) #### 在本教程中,我們將借助示例學習 Java 中的`super`關鍵字。 Java 中的`super`關鍵字在子類中用于訪問超類成員(屬性,構造器和方法)。 在學習`super`關鍵字之前,請確保了解 [Java 繼承](/java-programming/inheritance "Java inheritance")。 * * * ## `super`關鍵字的用途 1. 調用在子類中覆蓋的超類的方法。 2. 如果超類和子類都具有相同名稱的屬性,則訪問超類的屬性(字段)。 3. 從子類構造器中顯式調用超類無參(默認)或參數化構造器。 讓我們了解其中的每種用法。 * * * ## 1.訪問超類的被覆蓋方法 如果在超類和子類中都定義了相同名稱的方法,則子類中的方法將覆蓋超類中的方法。 這稱為[方法覆蓋](/java-programming/method-overriding "Java Method Overriding")的方法。 ### 示例 1:方法覆蓋 ```java class Animal { // overridden method public void display(){ System.out.println("I am an animal"); } } class Dog extends Animal { // overriding method @Override public void display(){ System.out.println("I am a dog"); } public void printMessage(){ display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } } ``` **輸出** ```java I am a dog ``` 在此示例中,通過使`Dog`類的對象`dog1`,我們可以調用其方法`printMessage()`,該方法然后執行`display()`語句。 由于在兩個類中都定義了`display()`,因此`Dog`子類的方法將覆蓋`Animal`超類的方法。 因此,將調用子類的`display()`。 ![Java overriding example](https://img.kancloud.cn/bf/d3/bfd3ef1d716fd8e6260212c5c3ea892c_1084x848.png) **如果必須調用超類的被覆蓋方法怎么辦?** 如果需要調用超類`Animal`的覆蓋方法`display()`,則使用`super.display()`。 ### 示例 2:`super`調用超類方法 ```java class Animal { // overridden method public void display(){ System.out.println("I am an animal"); } } class Dog extends Animal { // overriding method @Override public void display(){ System.out.println("I am a dog"); } public void printMessage(){ // this calls overriding method display(); // this calls overridden method super.display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } } ``` **輸出**: ```java I am a dog I am an animal ``` 在這里,上述程序是如何工作的。 ![Working of super in Java](https://img.kancloud.cn/28/e1/28e19c00d506be2bb2d88957c85f9785_1118x880.png) * * * ## 2.訪問超類的屬性 超類和子類可以具有相同名稱的屬性。 我們使用`super`關鍵字訪問超類的屬性。 ### 示例 3:訪問超類屬性 ```java class Animal { protected String type="animal"; } class Dog extends Animal { public String type="mammal"; public void printType() { System.out.println("I am a " + type); System.out.println("I am an " + super.type); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printType(); } } ``` **輸出**: ```java I am a mammal I am an animal ``` 在此示例中,我們在超類`Animal`和子類`Dog`中都定義了相同的實例字段`type`。 然后,我們創建了`Dog`類的對象`dog1`。 然后,使用該對象調用`printType()`方法。 在`printType()`函數內, * `type`是子類`Dog`的屬性。 * `super.type`是超類`Animal`的屬性。 因此,`System.out.println("I am a " + type);`打印`I am a mammal`。 而且,`System.out.println("I am an " + super.type);`打印`I am an animal`。 * * * ## 3.使用`super()`訪問超類構造器 眾所周知,創建類的對象時,將自動調用其默認構造器。 要從子類構造器中顯式調用超類構造器,我們使用`super()`。 這是`super`關鍵字的一種特殊形式。 `super()`僅可在子類構造器中使用,并且必須是第一條語句。 ### 示例 4:使用`super()` ```java class Animal { // default or no-arg constructor of class Animal Animal() { System.out.println("I am an animal"); } } class Dog extends Animal { // default or no-arg constructor of class Dog Dog() { // calling default constructor of the superclass super(); System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } } ``` **輸出** ```java I am an animal I am a dog ``` 在這里,當創建`Dog`類的對象`dog1`時,它將自動調用該類的默認或無參數構造器。 在子類構造器中,`super()`語句調用超類的構造器并在其中執行該語句。 因此,我們得到輸出<samp>我是動物</samp>。 ![Working of super() in Java](https://img.kancloud.cn/b0/1e/b01e5a1d75b31ccf1e79550be0be854d_904x848.png) 然后,程序流返回到子類構造器,并執行其余的語句。 因此,將打印<samp>我是狗</samp>。 但是,不是必須使用`super()`。 即使在子類構造器中未使用`super()`,編譯器也會隱式調用超類的默認構造器。 **那么,如果編譯器自動調用`super()`,為什么還要使用冗余代碼?** 如果必須從子類構造器中調用超類的**參數化構造器(帶有參數的構造器)**,則是必需的。 參數化的`super()`必須始終是子類的構造器主體中的第一條語句,否則,將出現編譯錯誤。 ### 示例 5:使用`super()`調用參數化構造器 ```java class Animal { // default or no-arg constructor Animal() { System.out.println("I am an animal"); } // parameterized constructor Animal(String type) { System.out.println("Type: "+type); } } class Dog extends Animal { // default constructor Dog() { // calling parameterized constructor of the superclass super("Animal"); System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); } } ``` **輸出**: ```java Type: Animal I am a dog ``` 編譯器可以自動調用無參構造器。 但是,它不能調用參數化的構造器。 如果必須調用參數化的構造器,則需要在子類構造器中顯式定義它。 ![Working of super in case of parameterized constructor.](https://img.kancloud.cn/43/57/4357b09dd8960ebc20dc9d1cb85e9a1a_1016x848.png) 請注意,在上面的示例中,我們顯式調用了參數化構造器`super("Animal")`。 在這種情況下,編譯器不會調用超類的默認構造器。
                  <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>

                              哎呀哎呀视频在线观看