<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/10-Interfaces?id=%e5%a4%9a%e6%8e%a5%e5%8f%a3%e7%bb%93%e5%90%88) 接口沒有任何實現——也就是說,沒有任何與接口相關的存儲——因此無法阻止結合的多接口。這是有價值的,因為你有時需要表示“一個**x**是一個**a**和一個**b**以及一個**c**”。 ![類圖](https://lingcoder.gitee.io/onjava8/images/1562999314238.png) 派生類并不要求必須繼承自抽象的或“具體的”(沒有任何抽象方法)的基類。如果繼承一個非接口的類,那么只能繼承一個類,其余的基元素必須都是接口。需要將所有的接口名稱置于**implements**關鍵字之后且用逗號分隔。可以有任意多個接口,并可以向上轉型為每個接口,因為每個接口都是獨立的類型。下例展示了一個由多個接口組合而成的具體類產生的新類: ~~~ // interfaces/Adventure.java // Multiple interfaces interface CanFight { void fight(); } interface CanSwim { void swim(); } interface CanFly { void fly(); } class ActionCharacter { public void fight(){} } class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() {} public void fly() {} } public class Adventure { public static void t(CanFight x) { x.fight(); } public static void u(CanSwim x) { x.swim(); } public static void v(CanFly x) { x.fly(); } public static void w(ActionCharacter x) { x.fight(); } public static void main(String[] args) { Hero h = new Hero(); t(h); // Treat it as a CanFight u(h); // Treat it as a CanSwim v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter } } ~~~ 類**Hero**結合了具體類**ActionCharacter**和接口**CanFight**、**CanSwim**和**CanFly**。當通過這種方式結合具體類和接口時,需要將具體類放在前面,后面跟著接口(否則編譯器會報錯)。 接口**CanFight**和類**ActionCharacter**中的`fight()`方法簽名相同,而在類 Hero 中也沒有提供`fight()`的定義。可以擴展一個接口,但是得到的是另一個接口。當想創建一個對象時,所有的定義必須首先都存在。類**Hero**中沒有顯式地提供`fight()`的定義,是由于該方法在類**ActionCharacter**中已經定義過,這樣才使得創建**Hero**對象成為可能。 在類**Adventure**中可以看到四個方法,它們把不同的接口和具體類作為參數。當創建一個**Hero**對象時,它可以被傳入這些方法中的任意一個,意味著它可以依次向上轉型為每個接口。Java 中這種接口的設計方式,使得程序員不需要付出特別的努力。 記住,前面例子展示了使用接口的核心原因之一:為了能夠向上轉型為多個基類型(以及由此帶來的靈活性)。然而,使用接口的第二個原因與使用抽象基類相同:防止客戶端程序員創建這個類的對象,確保這僅僅只是一個接口。這帶來了一個問題:應該使用接口還是抽象類呢?如果創建不帶任何方法定義或成員變量的基類,就選擇接口而不是抽象類。事實上,如果知道某事物是一個基類,可以考慮用接口實現它(這個主題在本章總結會再次討論)。
                  <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>

                              哎呀哎呀视频在线观看