<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/09-Polymorphism?id=%e5%90%91%e4%b8%8b%e8%bd%ac%e5%9e%8b%e4%b8%8e%e8%bf%90%e8%a1%8c%e6%97%b6%e7%b1%bb%e5%9e%8b%e4%bf%a1%e6%81%af) 由于向上轉型(在繼承層次中向上移動)會丟失具體的類型信息,那么為了重新獲取類型信息,就需要在繼承層次中向下移動,使用*向下轉型*。 向上轉型永遠是安全的,因為基類不會具有比派生類更多的接口。因此,每條發送給基類接口的消息都能被接收。但是對于向下轉型,你無法知道一個形狀是圓,它有可能是三角形、正方形或其他一些類型。 為了解決這個問題,必須得有某種方法確保向下轉型是正確的,防止意外轉型到一個錯誤類型,進而發送對象無法接收的消息。這么做是不安全的。 在某些語言中(如 C++),必須執行一個特殊的操作來獲得安全的向下轉型,但是在 Java 中,每次轉型都會被檢查!所以即使只是進行一次普通的加括號形式的類型轉換,在運行時這個轉換仍會被檢查,以確保它的確是希望的那種類型。如果不是,就會得到 ClassCastException (類轉型異常)。這種在運行時檢查類型的行為稱作運行時類型信息。下面例子展示了 RTTI 的行為: ~~~ // polymorphism/RTTI.java // Downcasting & Runtime type information (RTTI) // {ThrowsException} class Useful { public void f() {} public void g() {} } class MoreUseful extends Useful { @Override public void f() {} @Override public void g() {} public void u() {} public void v() {} public void w() {} } public class RTTI { public static void main(String[] args) { Useful[] x = { new Useful(), new MoreUseful() }; x[0].f(); x[1].g(); // Compile time: method not found in Useful: //- x[1].u(); ((MoreUseful) x[1]).u(); // Downcast/RTTI ((MoreUseful) x[0]).u(); // Exception thrown } } ~~~ 輸出: ~~~ Exception in thread "main" java.lang.ClassCastException: Useful cannot be cast to MoreUseful at RTTI.main ~~~ 正如前面類圖所示,**MoreUseful**擴展了**Useful**的接口。而**MoreUseful**也繼承了**Useful**,所以它可以向上轉型為**Useful**。在`main()`方法中可以看到這種情況的發生。因為兩個對象都是**Useful**類型,所以對它們都可以調用`f()`和`g()`方法。如果試圖調用`u()`方法(只存在于**MoreUseful**中),就會得到編譯時錯誤信息。 為了訪問**MoreUseful**對象的擴展接口,就得嘗試向下轉型。如果轉型為正確的類型,就轉型成功。否則,就會得到 ClassCastException 異常。你不必為這個異常編寫任何特殊代碼,因為它指出了程序員在程序的任何地方都可能犯的錯誤。\*\*{ThrowsException}\*\* 注釋標簽告知本書的構建系統:在運行程序時,預期拋出一個異常。 RTTI 不僅僅包括簡單的轉型。例如,它還提供了一種方法,使你可以在試圖向下轉型前檢查所要處理的類型。“類型信息”一章中會詳細闡述運行時類型信息的方方面面。
                  <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>

                              哎呀哎呀视频在线观看