<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國際加速解決方案。 廣告
                [TOC] # 多態 Java中多態的代碼體現在一個子類對象(實現類對象)既可以給這個子類(實現類對象)引用變量賦值,又可以給這個子類(實現類對象)的父類(接口)變量賦值。 如Student類可以為Person類的子類。那么一個Student對象既可以賦值給一個Student類型的引用,也可以賦值給一個Person類型的引用。 最終多態體現為父類引用變量可以指向子類對象。 多態的前提是必須有子父類關系或者類實現接口關系,否則無法完成多態。 在使用多態后的父類引用變量調用方法時,會調用子類重寫后的方法。 # 定義 多態的定義格式:就是父類的引用變量指向子類對象 父類類型 變量名 = new 子類類型(); 變量名.方法名(); ## 普通類多態定義的格式 父類 變量名 = new 子類(); ~~~ class Fu {} class Zi extends Fu {} //類的多態使用 Fu f = new Zi(); ~~~ ## 抽象類多態定義的格式 抽象類 變量名 = new 抽象類子類(); ~~~ abstract class Fu { public abstract void method(); } class Zi extends Fu { public void method() { System.out.println(“重寫父類抽象方法”); } } //類的多態使用 Fu fu= new Zi(); ~~~ ## 接口多態定義的格式 接口 變量名 = new 接口實現類(); ~~~ interface Fu { public abstract void method(); } class Zi implements Fu { public void method(){ System.out.println(“重寫接口抽象方法”); } } //接口的多態使用 Fu fu = new Zi(); ~~~ # 注意事項 同一個父類的方法會被不同的子類重寫。在調用方法時,調用的為各個子類重寫后的方法。 ~~~ Person p1 = new Student(); Person p2 = new Teacher(); p1.work(); //p1會調用Student類中重寫的work方法 p2.work(); //p2會調用Teacher類中重寫的work方法 ~~~ 當變量名指向不同的子類對象時,由于每個子類重寫父類方法的內容不同,所以會調用不同的方法。 ## 多態成員變量 當子父類中出現同名的成員變量時,多態調用該變量時: 編譯時期:參考的是引用型變量所屬的類中是否有被調用的成員變量。沒有,編譯失敗。 運行時期:也是調用引用型變量所屬的類中的成員變量。 簡單記:**編譯運行看左邊**。 ## 多態成員方法 編譯時期:參考引用變量所屬的類,如果沒有類中沒有調用的方法,編譯失敗。 運行時期:參考引用變量所指的對象所屬的類,并運行對象所屬類中的成員方法。 簡而言之:**編譯看左邊,運行看右邊**。 ## 案例 ~~~ package com.study; public class Fu { public Integer a = 1; public void show() { System.out.println("fu"); System.out.println(a); } } class Zi extends Fu { public Integer a = 2; public void show() { System.out.println("zi"); System.out.println(a); } } class Test { public static void main(String[] args) { Fu fu = new Zi(); fu.show(); System.out.println("---"); System.out.println(fu.a); } } ~~~ 輸出 ~~~ zi 2 --- 1 ~~~ # 多態-轉型 多態的轉型分為向上轉型與向下轉型兩種: * 向上轉型:當有子類對象賦值給一個父類引用時,便是向上轉型,**多態本身就是向上轉型的過程**。 使用格式: `父類類型 變量名 = new 子類類型();` 如:`Person p = new Student();` * 向下轉型:一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的! 使用格式: 子類類型 變量名 = (子類類型) 父類類型的變量; 如:`Student stu = (Student) p; //變量p 實際上指向Student對象` # 弊端 當父類的引用指向子類對象時,就發生了向上轉型,即把子類類型對象轉成了父類類型。向上轉型的好處是隱藏了子類類型,提高了代碼的擴展性。 **但向上轉型也有弊端,只能使用父類共性的內容,而無法使用子類特有功能,功能有限制**。看如下代碼 我們來總結一下: * 什么時候使用向上轉型: 當不需要面對子類類型時,通過提高擴展性,或者使用父類的功能就能完成相應的操作,這時就可以使用向上轉型。 ~~~ Animal a = new Dog(); a.eat(); ~~~ * 什么時候使用向下轉型 當要使用子類特有功能時,就需要使用向下轉型。 ~~~ Dog d = (Dog) a; //向下轉型 d.lookHome();//調用狗類的lookHome方法 ~~~ * 向下轉型的好處:可以使用子類特有功能。 * 弊端是:需要面對具體的子類對象;在向下轉型時容易發生ClassCastException類型轉換異常。在轉換之前必須做類型判斷。 `如:if( !a instanceof Dog){…}` # instanceof 我們可以通過instanceof關鍵字來判斷某個對象是否屬于某種數據類型。如學生的對象屬于學生類,學生的對象也屬于人類。 使用格式: ~~~ boolean b = 對象 instanceof 數據類型; ~~~ 如 ~~~ Person p1 = new Student(); // 前提條件,學生類已經繼承了人類 boolean flag = p1 instanceof Student; //flag結果為true boolean flag2 = p2 instanceof Teacher; //flag結果為false ~~~
                  <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>

                              哎呀哎呀视频在线观看