《疯狂Java讲义》——闭包和回调

非静态内部类不仅记录了其外部内的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以调用外部类的private成员,可以把非静态内部类当成面向对象领域的闭包。于是客户类可以通过非静态内部类的引用来调用外部类,即回调

//教师接口
interface Teachable
{
    void work();//work方法
}

//程序员类
class Programmer
{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Programmer(){}
    public Programmer(String name)
    {
        this.name = name; 
    }
    //work方法
    public void work()
    {
        System.out.println(name + "programming");
    }
}

//Programer类的子类
class TeachableProgrammer extends Programmer
{
    public TeachableProgrammer(){}
    public TeachableProgrammer(String name)
    {
        super(name);//调用其父类含参的构造方法
    }
    //私有的teach方法
    private void teach()
    {
        System.out.println("teaching");
    }
    //非静态内部类实现教师接口
    private class Closure implements Teachable {
        //实现其work方法
        public void work()
        {
            teach();//调用外部类的私有的teach方法
        }
    }
    //返回内部类的实例
    public Teachable getCallbachReference()
    {
        return new Closure();
    }
}

public class Test{

    public static void main(String[] args) {
        TeachableProgrammer tp = new TeachableProgrammer("Jane");
        tp.work();//调用继承自父类的work方法
        //表面上调用的是Closure类的work方法
        //实际上调用的是TeachableProgrammer的teach方法
        tp.getCallbachReference().work();
    }
}

你可能感兴趣的:(《疯狂Java讲义》——闭包和回调)