1. 程式人生 > >Java內部類(5):應用例

Java內部類(5):應用例

ont 應用 情況 test 調用 sub() spa ren tro

例1-閉包(Closure)

閉包是一個可調用的對象(通過Callback),它記錄了一些信息,這些信息來自於創建它的作用域

 1 interface Incrementable {
 2     void increment();
 3 }
 4 
 5 class Callee1 implements Incrementable {
 6     private int i = 0;
 7 
 8     @Override
 9     public void increment() {
10         i++;
11         System.out.println(i);
12
} 13 } 14 15 class MyIncrement { 16 public void increment() { 17 System.out.println("Other operation"); 18 } 19 20 static void f(MyIncrement mi) { 21 mi.increment(); 22 } 23 } 24 25 class Callee2 extends MyIncrement { 26 private int i = 0; 27 28 @Override
29 public void increment() { 30 super.increment(); 31 i++; 32 System.out.println(i); 33 } 34 35 private class Closure implements Incrementable { 36 @Override 37 public void increment() { 38 Callee2.this.increment(); 39 } 40 }
41 42 Incrementable callBack() { 43 return new Closure(); 44 } 45 } 46 47 class Caller { 48 private Incrementable callbackReference; 49 50 Caller(Incrementable callbackReference) { 51 this.callbackReference = callbackReference; 52 } 53 54 void go() { 55 callbackReference.increment(); 56 } 57 } 58 59 /** 60 * 關鍵字: 內部類應用, 閉包(Closure)<br/> 61 * 1.閉包是一個可調用的對象(通過Callback),它記錄了一些信息,這些信息來自於創建它的作用域<br/> 62 */ 63 public class Test007 { 64 65 public static void main(String[] args) { 66 Callee1 c1 = new Callee1(); 67 c1.increment(); // 1 68 Callee2 c2 = new Callee2(); 69 MyIncrement.f(c2); // Other operation|1 70 Caller caller1 = new Caller(c1); 71 caller1.go(); // 2 72 Caller caller2 = new Caller(c2.callBack()); 73 caller2.go(); // Other operation|2 74 } 75 }

例2-復雜情況下的調用順序

 1 class Egg2 {
 2 
 3     protected class Yolk {
 4         public Yolk() {
 5             System.out.println("Egg2.Yolk()");
 6         }
 7 
 8         public void f() {
 9             System.out.println("Egg2.Yolk.f()");
10         }
11     }
12 
13     private Yolk y = new Yolk();
14 
15     public Egg2() {
16         System.out.println("New Egg2()");
17     }
18 
19     public void insertYolk(Yolk yy) {
20         y = yy;
21     }
22 
23     public void g() {
24         y.f();
25     }
26 }
27 
28 class Test008Sub extends Egg2 {
29     public Test008Sub() {
30         System.out.println("AA");
31         insertYolk(new Yolk());
32     }
33 
34     public class Yolk extends Egg2.Yolk {
35         public Yolk() {
36             System.out.println("BigEgg2.Yolk()");
37         }
38 
39         public void f() {
40             System.out.println("BigEgg2.Yolk.f()");
41         }
42     }
43 }
44 
45 // 復雜情況下的調用順序
46 public class Test008 {
47     public static void main(String[] args) {
48         new Test008Sub().g();
49         // Egg2.Yolk()
50         // New Egg2()
51         // AA
52         // Egg2.Yolk()
53         // BigEgg2.Yolk()
54         // BigEgg2.Yolk.f()
55     }
56 }

Java內部類(5):應用例