• Java内部类(5):应用例


    例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】对象赋值给另一个对象
    spring boot系列(五)spring boot 配置spring data jpa (查询方法)
    Spring Data JPA 查询
    Spring Data JPA 介绍
    OpenID简介
    OAUTH协议介绍
    URL encoding(URL编码)
    RESTful 介绍
    spring boot系列(四)spring boot 配置spring data jpa (保存修改删除方法)
    spring boot 启动报 java.lang.NoClassDefFoundError: ch/qos/logback/core/spi/LifeCycle 错误
  • 原文地址:https://www.cnblogs.com/storml/p/8318364.html
Copyright © 2020-2023  润新知