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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## [為什么需要內部類](https://lingcoder.gitee.io/onjava8/#/book/11-Inner-Classes?id=%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81%e5%86%85%e9%83%a8%e7%b1%bb) 至此,我們已經看到了許多描述內部類的語法和語義,但是這并不能同答“為什么需要內部類”這個問題。那么,Java 設計者們為什么會如此費心地增加這項基本的語言特性呢? 一般說來,內部類繼承自某個類或實現某個接口,內部類的代碼操作創建它的外部類的對象。所以可以認為內部類提供了某種進入其外部類的窗口。 內部類必須要回答的一個問題是:如果只是需要一個對接口的引用,為什么不通過外部類實現那個接口呢?答案是:“如果這能滿足需求,那么就應該這樣做。”那么內部類實現一個接口與外部類實現這個接口有什么區別呢?答案是:后者不是總能享用到接口帶來的方便,有時需要用到接口的實現。所以,使用內部類最吸引人的原因是: > 每個內部類都能獨立地繼承自一個(接口的)實現,所以無論外部類是否已經繼承了某個(接口的)實現,對于內部類都沒有影響。 如果沒有內部類提供的、可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內部類有效地實現了“多重繼承”。也就是說,內部類允許繼承多個非接口類型(譯注:類或抽象類)。 為了看到更多的細節,讓我們考慮這樣一種情形:即必須在一個類中以某種方式實現兩個接口。由于接口的靈活性,你有兩種選擇;使用單一類,或者使用內部類: ~~~ // innerclasses/mui/MultiInterfaces.java // Two ways a class can implement multiple interfaces // {java innerclasses.mui.MultiInterfaces} package innerclasses.mui; interface A {} interface B {} class X implements A, B {} class Y implements A { B makeB() { // Anonymous inner class: return new B() {}; } } public class MultiInterfaces { static void takesA(A a) {} static void takesB(B b) {} public static void main(String[] args) { X x = new X(); Y y = new Y(); takesA(x); takesA(y); takesB(x); takesB(y.makeB()); } } ~~~ 當然,這里假設在兩種方式下的代碼結構都確實有邏輯意義。然而遇到問題的時候,通常問題本身就能給出某些指引,告訴你是應該使用單一類,還是使用內部類。但如果沒有任何其他限制,從實現的觀點來看,前面的例子并沒有什么區別,它們都能正常運作。 如果擁有的是抽象的類或具體的類,而不是接口,那就只能使用內部類才能實現多重繼承: ~~~ // innerclasses/MultiImplementation.java // For concrete or abstract classes, inner classes // produce "multiple implementation inheritance" // {java innerclasses.MultiImplementation} package innerclasses; class D {} abstract class E {} class Z extends D { E makeE() { return new E() {}; } } public class MultiImplementation { static void takesD(D d) {} static void takesE(E e) {} public static void main(String[] args) { Z z = new Z(); takesD(z); takesE(z.makeE()); } } ~~~ 如果不需要解決“多重繼承”的問題,那么自然可以用別的方式編碼,而不需要使用內部類。但如果使用內部類,還可以獲得其他一些特性: 1. 內部類可以有多個實例,每個實例都有自己的狀態信息,并且與其外部類對象的信息相互獨立。 2. 在單個外部類中,可以讓多個內部類以不同的方式實現同一個接口,或繼承同一個類。 稍后就會展示一個這樣的例子。 3. 創建內部類對象的時刻并不依賴于外部類對象的創建 4. 內部類并沒有令人迷惑的"is-a”關系,它就是一個獨立的實體。 舉個例子,如果**Sequence.java**不使用內部類,就必須聲明"**Sequence**是一個**Selector**",對于某個特定的**Sequence**只能有一個**Selector**,然而使用內部類很容易就能擁有另一個方法`reverseSelector()`,用它來生成一個反方向遍歷序列的**Selector**,只有內部類才有這種靈活性。
                  <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>

                              哎呀哎呀视频在线观看