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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 多態 [TOC] 從某種意義上來講,封裝和繼承都是為了多態而準備的 在Java中多態性分為兩種不同的展現形式 ## 方法的多態性(編譯時多態) 前面我們在兩處地方提到了方法的多態性,一是方法的重載,還有就是方法的重寫 >[info] 方法重載的多態性的意義在于一個方法名稱有不同的實現; > 方法重寫多態性的實現在于,父類的一個方法,不同的子類可以有不同的實現 ## 對象的多態性(運行時多態) 我們在Java程序中說的多態大多指的是運行時多態,所以我們后面直接用多態來稱呼 >[warning] Java引用類型變量有兩種類型:一種是編譯時類型,一種是運行時類型 * 編譯的類型是由聲明變量的時候確定的 * 運行時的類型是由實際上賦給該變量的對象決定的 ~~~java //比如聲明變量類型為Animal,實際賦給該變量的對象類型為Dog Animal animal = new Dog(); ~~~ **如果運行時類型和編譯時類型不一致就會出現所謂的多態** * 首先編譯時類型和運行時類型得是父類和子類的關系 * 多態最常用的場景就是子類重寫父類方法后,如果引用變量的類型為父類,而對象為子類,如果引用類型調用重寫方法,回去執行子類定義的實現 ~~~java public class Test { public static void main(String[] args) { //簡單的子類繼承和實例化對象 /*Dog dog = new Dog(); dog.say(); Cat cat = new Cat(); cat.say();*/ //多態的測試 //父類引用指向Dog子類的具體實現 Animal animal = new Dog(); animal.say(); System.out.println("**********"); // 更換實現 animal = new Cat(); animal.say(); } } ~~~ ## 引用類型的強制類型轉換 ~~~ public class Animal { public void say() { System.out.println("我是一個動物"); } public void sleep() { System.out.println("動物在睡覺"); } } public class Dog extends Animal { public void say() { System.out.println("我是一個狗"); } public void play() { System.out.println("狗正在玩"); } } public class Test { public static void main(String[] args) { //對象的轉型 //對象向上轉型:子類對象 ->父類對象 安全 Animal animal = new Dog(); animal.say(); animal.sleep(); //對象向下轉型 (引用類型的強制類型轉換):父類對象——>子類對象 不安全 //向下轉型必須發生在向上轉型之后,才可以進行向下轉型 Dog dog = (Dog) animal; dog.say(); dog.play(); Cat cat = (Cat) animal; cat.say(); } } ~~~ 編寫Java程序的時候,引用變量只能調用它編譯時的方法,而不能調用其運行時的方法,如果你必須要調用其運行時的類型,則需要進行強制類型轉換。 強制類型轉換實際上是把大的類型轉為小的類型。 在我們的引用數據類型里面,大的類型是父類,小的類型是子類。 只可能發生在子類和父類的關系中。 ## instanceof運算符 instanceof運算符的前一個操作數一般是引用數據類型的變量,后一個操作數是類名(接口),它是用于判斷前面的對象是否是后面的類,或者其子類。如果是的話,返回true; >[info] instanceof 運算符一般用于在我們對引用數據類型進行強制類型轉換之前進行判斷使用 > 避免在實際的運行過程中出現classCastException。 ~~~ public static void main(String[] args) { Animal tom = new Dog(); Animal mimi = new Cat(); Animal ani = new Animal(); if(ani instanceof Dog) { Dog dog = (Dog)ani; System.out.println("&&"); System.out.println(dog.getAge()); } if(tom instanceof Dog) { Dog dog2 = (Dog) tom; System.out.println("**"); System.out.println(dog2.getAge()); } } ~~~
                  <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>

                              哎呀哎呀视频在线观看