<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 功能強大 支持多語言、二開方便! 廣告
                ### [忘掉對象類型](https://lingcoder.gitee.io/onjava8/#/book/09-Polymorphism?id=%e5%bf%98%e6%8e%89%e5%af%b9%e8%b1%a1%e7%b1%bb%e5%9e%8b) **Music.java**看起來似乎有點奇怪。為什么所有人都故意忘記掉對象類型呢?當向上轉型時,就會發生這種情況,而且看起來如果`tune()`接受的參數是一個**Wind**引用會更為直觀。這會帶來一個重要問題:如果你那么做,就要為系統內**Instrument**的每種類型都編寫一個新的`tune()`方法。假設按照這種推理,再增加**Stringed**和**Brass**這兩種**Instrument**: ~~~ // polymorphism/music/Music2.java // Overloading instead of upcasting // {java polymorphism.music.Music2} package polymorphism.music; class Stringed extends Instrument { @Override public void play(Note n) { System.out.println("Stringed.play() " + n); } } class Brass extends Instrument { @Override public void play(Note n) { System.out.println("Brass.play() " + n); } } public class Music2 { public static void tune(Wind i) { i.play(Note.MIDDLE_C); } public static void tune(Stringed i) { i.play(Note.MIDDLE_C); } public static void tune(Brass i) { i.play(Note.MIDDLE_C); } public static void main(String[] args) { Wind flute = new Wind(); Stringed violin = new Stringed(); Brass frenchHorn = new Brass(); tune(flute); // No upcasting tune(violin); tune(frenchHorn); } } ~~~ 輸出: ~~~ Wind.play() MIDDLE_C Stringed.play() MIDDLE_C Brass.play() MIDDLE_C ~~~ 這樣行得通,但是有一個主要缺點:必須為添加的每個新**Instrument**類編寫特定的方法。這意味著開始時就需要更多的編程,而且以后如果添加類似`tune()`的新方法或**Instrument**的新類型時,還有大量的工作要做。考慮到如果你忘記重載某個方法,編譯器也不會提示你,這會造成類型的整個處理過程變得難以管理。 如果只寫一個方法以基類作為參數,而不用管是哪個具體派生類,這樣會變得更好嗎?也就是說,如果忘掉派生類,編寫的代碼只與基類打交道,會不會更好呢? 這正是多態所允許的。但是大部分擁有面向過程編程背景的程序員會對多態的運作方式感到一些困惑。
                  <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>

                              哎呀哎呀视频在线观看