<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國際加速解決方案。 廣告
                ## [向上轉型](https://lingcoder.gitee.io/onjava8/#/book/08-Reuse?id=%e5%90%91%e4%b8%8a%e8%bd%ac%e5%9e%8b) 繼承最重要的方面不是為新類提供方法。它是新類與基類的一種關系。簡而言之,這種關系可以表述為“新類是已有類的一種類型”。 這種描述并非是解釋繼承的一種花哨方式,這是直接由語言支持的。例如,假設有一個基類**Instrument**代表音樂樂器和一個派生類**Wind**。 因為繼承保證了基類的所有方法在派生類中也是可用的,所以任意發送給該基類的消息也能發送給派生類。如果**Instrument**有一個`play()`方法,那么**Wind**也有該方法。這意味著你可以準確地說**Wind**對象也是一種類型的**Instrument**。下面例子展示了編譯器是如何支持這一概念的: ~~~ // reuse/Wind.java // Inheritance & upcasting class Instrument { public void play() {} static void tune(Instrument i) { // ... i.play(); } } // Wind objects are instruments // because they have the same interface: public class Wind extends Instrument { public static void main(String[] args) { Wind flute = new Wind(); Instrument.tune(flute); // Upcasting } } ~~~ `tune()`方法接受了一個**Instrument**類型的引用。但是,在**Wind**的`main()`方法里,`tune()`方法卻傳入了一個**Wind**引用。鑒于 Java 對類型檢查十分嚴格,一個接收一種類型的方法接受了另一種類型看起來很奇怪,除非你意識到**Wind**對象同時也是一個**Instrument**對象,而且**Instrument**的`tune`方法一定會存在于**Wind**中。在`tune()`中,代碼對**Instrument**和 所有**Instrument**的派生類起作用,這種把**Wind**引用轉換為**Instrument**引用的行為稱作*向上轉型*。 該術語是基于傳統的類繼承圖:圖最上面是根,然后向下鋪展。(當然你可以以任意方式畫你認為有幫助的類圖。)于是,**Wind.java**的類圖是: ![Wind 類圖](https://lingcoder.gitee.io/onjava8/images/1561774164644.png) 繼承圖中派生類轉型為基類是向上的,所以通常稱作*向上轉型*。因為是從一個更具體的類轉化為一個更一般的類,所以向上轉型永遠是安全的。也就是說,派生類是基類的一個超集。它可能比基類包含更多的方法,但它必須至少具有與基類一樣的方法。在向上轉型期間,類接口只可能失去方法,不會增加方法。這就是為什么編譯器在沒有任何明確轉型或其他特殊標記的情況下,仍然允許向上轉型的原因。 也可以執行與向上轉型相反的向下轉型,但是會有問題,對于該問題會放在下一章和“類型信息”一章進行更深入的探討。
                  <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>

                              哎呀哎呀视频在线观看