interface Teachable
{
	void work();
}
class Programmer
{
	private String name;
	//Programmer类的两个构造器
	public Programmer(){}
	public Programmer(String name)
	{
		this.name = name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}
	public void work()
	{
		System.out.println(name + "在灯下认真敲键盘...");
	}

}

public class TeachableProgrammer extends Programmer
{
	public TeachableProgrammer(){}
	public TeachableProgrammer(String name)
	{
		super(name);
	}
	//教学工作依然由TeachableProgrammer类定义
	private void teach()
	{
		System.out.println(getName() + "教师在讲台上讲解...");
	}
	private class Closure implements Teachable
	{
		/*
		 非静态内部类回调外部类实现work方法,非静态内部类引用的作用仅仅是
		 向客户类提供一个回调外部类的途径
		 */
		public void work()
		{
			teach();
		}	
	}
	//返回一个非静态内部类引用,允许外部类通过该非静态内部类引用来回调外部类的方法
	public Teachable getCallbackReference()
	{
		return new Closure();
	}


	public static void main(String[] args)
	{
		TeachableProgrammer person=new TeachableProgrammer("李刚");		
		person.work();
		Teachable teacher=person.getCallbackReference();
		teacher.work();

	}

}
/*
李刚在灯下认真敲键盘...
李刚教师在讲台上讲解...
请按任意键继续. . .
*/