<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=%e9%93%be%e6%8e%a5%e5%a4%96%e9%83%a8%e7%b1%bb) 到目前為止,內部類似乎還只是一種名字隱藏和組織代碼的模式。這些是很有用,但還不是最引人注目的,它還有其他的用途。當生成一個內部類的對象時,此對象與制造它的外部對象(enclosing object)之間就有了一種聯系,所以它能訪問其外部對象的所有成員,而不需要任何特殊條件。此外,內部類還擁有其外部類的所有元素的訪問權。 ~~~ // innerclasses/Sequence.java // Holds a sequence of Objects interface Selector { boolean end(); Object current(); void next(); } public class Sequence { private Object[] items; private int next = 0; public Sequence(int size) { items = new Object[size]; } public void add(Object x) { if(next < items.length) items[next++] = x; } private class SequenceSelector implements Selector { private int i = 0; @Override public boolean end() { return i == items.length; } @Override public Object current() { return items[i]; } @Override public void next() { if(i < items.length) i++; } } public Selector selector() { return new SequenceSelector(); } public static void main(String[] args) { Sequence sequence = new Sequence(10); for(int i = 0; i < 10; i++) sequence.add(Integer.toString(i)); Selector selector = sequence.selector(); while(!selector.end()) { System.out.print(selector.current() + " "); selector.next(); } } } ~~~ 輸出為: ~~~ 0 1 2 3 4 5 6 7 8 9 ~~~ **Sequence**類只是一個固定大小的**Object**的數組,以類的形式包裝了起來。可以調用`add()`在序列末尾增加新的**Object**(只要還有空間),要獲取**Sequence**中的每一個對象,可以使用**Selector**接口。這是“迭代器”設計模式的一個例子,在本書稍后的部分將更多地學習它。**Selector**允許你檢查序列是否到末尾了(`end()`),訪問當前對象(`current()`),以及移到序列中的下一個對象(`next()`)。因為**Selector**是一個接口,所以別的類可以按它們自己的方式來實現這個接口,并且其他方法能以此接口為參數,來生成更加通用的代碼。 這里,**SequenceSelector**是提供**Selector**功能的**private**類。可以看到,在`main()`中創建了一個**Sequence**,并向其中添加了一些**String**對象。然后通過調用`selector()`獲取一個**Selector**,并用它在**Sequence**中移動和選擇每一個元素。 最初看到**SequenceSelector**,可能會覺得它只不過是另一個內部類罷了。但請仔細觀察它,注意方法`end()`,`current()`和`next()`都用到了**items**,這是一個引用,它并不是**SequenceSelector**的一部分,而是外部類中的一個**private**字段。然而內部類可以訪問其外部類的方法和字段,就像自己擁有它們似的,這帶來了很大的方便,就如前面的例子所示。 所以內部類自動擁有對其外部類所有成員的訪問權。這是如何做到的呢?當某個外部類的對象創建了一個內部類對象時,此內部類對象必定會秘密地捕獲一個指向那個外部類對象的引用。然后,在你訪問此外部類的成員時,就是用那個引用來選擇外部類的成員。幸運的是,編譯器會幫你處理所有的細節,但你現在可以看到:內部類的對象只能在與其外部類的對象相關聯的情況下才能被創建(就像你應該看到的,內部類是非**static**類時)。構建內部類對象時,需要一個指向其外部類對象的引用,如果編譯器訪問不到這個引用就會報錯。不過絕大多數時候這都無需程序員操心。
                  <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>

                              哎呀哎呀视频在线观看