<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/11-Inner-Classes?id=%e9%97%ad%e5%8c%85%e4%b8%8e%e5%9b%9e%e8%b0%83) 閉包(**closure**)是一個可調用的對象,它記錄了一些信息,這些信息來自于創建它的作用域。通過這個定義,可以看出內部類是面向對象的閉包,因為它不僅包含外部類對象(創建內部類的作用域)的信息,還自動擁有一個指向此外部類對象的引用,在此作用域內,內部類有權操作所有的成員,包括**private**成員。 在 Java 8 之前,內部類是實現閉包的唯一方式。在 Java 8 中,我們可以使用 lambda 表達式來實現閉包行為,并且語法更加優雅和簡潔,你將會在[函數式編程](https://lingcoder.gitee.io/onjava8/#/)這一章節中學習相關細節。盡管相對于內部類,你可能更喜歡使用 lambda 表達式實現閉包,但是你會看到并需要理解那些在 Java 8 之前通過內部類方式實現閉包的代碼,因此仍然有必要來理解這種方式。 Java 最引人爭議的問題之一就是,人們認為 Java 應該包含某種類似指針的機制,以允許回調(callback)。通過回調,對象能夠攜帶一些信息,這些信息允許它在稍后的某個時刻調用初始的對象。稍后將會看到這是一個非常有用的概念。如果回調是通過指針實現的,那么就只能寄希望于程序員不會誤用該指針。然而,讀者應該已經了解到,Java 更小心仔細,所以沒有在語言中包括指針。 通過內部類提供閉包的功能是優良的解決方案,它比指針更靈活、更安全。見下例: ~~~ // innerclasses/Callbacks.java // Using inner classes for callbacks // {java innerclasses.Callbacks} package innerclasses; interface Incrementable { void increment(); } // Very simple to just implement the interface: class Callee1 implements Incrementable { private int i = 0; @Override public void increment() { i++; System.out.println(i); } } class MyIncrement { public void increment() { System.out.println("Other operation"); } static void f(MyIncrement mi) { mi.increment(); } } // If your class must implement increment() in // some other way, you must use an inner class: class Callee2 extends MyIncrement { private int i = 0; @Override public void increment() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { @Override public void increment() { // Specify outer-class method, otherwise // you'll get an infinite recursion: Callee2.this.increment(); } } Incrementable getCallbackReference() { return new Closure(); } } class Caller { private Incrementable callbackReference; Caller(Incrementable cbh) { callbackReference = cbh; } void go() { callbackReference.increment(); } } public class Callbacks { public static void main(String[] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); } } ~~~ 輸出為: ~~~ Other operation 1 1 2 Other operation 2 Other operation 3 ~~~ 這個例子進一步展示了外部類實現一個接口與內部類實現此接口之間的區別。就代碼而言,**Callee1**是更簡單的解決方式。**Callee2**繼承自**MyIncrement**,后者已經有了一個不同的`increment()`方法,并且與**Incrementable**接口期望的`increment()`方法完全不相關。所以如果**Callee2**繼承了**MyIncrement**,就不能為了**Incrementable**的用途而覆蓋`increment()`方法,于是只能使用內部類獨立地實現**Incrementable**,還要注意,當創建了一個內部類時,并沒有在外部類的接口中添加東西,也沒有修改外部類的接口。 注意,在**Callee2**中除了`getCallbackReference()`以外,其他成員都是**private**的。要想建立與外部世界的任何連接,接口**Incrementable**都是必需的。在這里可以看到,**interface**是如何允許接口與接口的實現完全獨立的。 內部類**Closure**實現了**Incrementable**,以提供一個返回**Callee2**的“鉤子”(hook)-而且是一個安全的鉤子。無論誰獲得此**Incrementable**的引用,都只能調用`increment()`,除此之外沒有其他功能(不像指針那樣,允許你做很多事情)。 **Caller**的構造器需要一個**Incrementable**的引用作為參數(雖然可以在任意時刻捕獲回調引用),然后在以后的某個時刻,**Caller**對象可以使用此引用回調**Callee**類。 回調的價值在于它的靈活性-可以在運行時動態地決定需要調用什么方法。例如,在圖形界面實現 GUI 功能的時候,到處都用到回調。
                  <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>

                              哎呀哎呀视频在线观看