闭包是一种能被调用的对象,它保存了创建它的作用域信息,java7中没有显示的支持闭包,但对于非静态的内部类而言,它不仅记录了其外部类的信息,还保留了一个创建非静态内部类对象的引用,并且可以直接回调外部类的private成员因此可以把非静态的内部类面向对象因此可以把非静态的内部类当成面向对象领域的闭包。
通过这种仿闭包的非静态的内部类可以实现回调,回调就是某个方法获得内部类的对象的引用后,就可以在合适的时候反过来去调用外部类的实例的方法,简单的说所谓回调就是允许客户类通过内部类的引用调用外部类的方法。
example:
下面定义了一个Teachable接口和Programmer基类,它们都提供了work方法 它们的方法签名完全一样但是功能是不一样的:
public interface Teachable {
void work();
}
public class Programmer {
private String name;
public Programmer()
{}
public Programmer(String name)
{
this.name=name;
}
public void work()
{
System.out.println("我是programmer。。。。。");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
假若在现实的生活当中存在这样人既是程序员也是讲师,就像黑马的好多老师,嘿嘿,也就是说要定义一个特殊的类,该类既要是实现Teachable接口也需要继承Programmer类表面上看没有任何问题,问题是该接口和类里定义了相同的work方法如果采用如下的代码定义一个特殊的TeachableProgrammer类
public class TeachableProgrammer extends Programmer implements Teachable
{
public work()
{
System.out.println(getName+"我在上课。。。");
}
}
显然上面的TeachableProgrammer类只有一个work()方法,这个work()方法只能进行教学的作用不可以进行编程的功能但实际上我们是既要教学的功能也要编程的功能的这个时候 解决的办法的就是可以用仿闭包的内部类来实现
public class Teacher_Programmer extends Programmer
{
public Teacher_Programmer()
{}
public Teacher_Programmer(String name)
{
super(name);
}
//隐藏细节
private void teach()
{
System.out.println(getName+"我在上课。。。");
}
//隐藏细节
private class Closure implements Teachable
{
@Override
public void work() {
// TODO Auto-generated method stub
teach();
}
}
public Teachable getTeachable()
{
return new Closure();
}
}
上面的TeachableProgrammer类只是Programmer的子类它可以直接的继承父类的方法,该类直接的涵盖了编程的方法的功能,与上面定义的接口没有关系,它也不能当成Teachable接口来使用,此时创建了一个Closure内部类它实现了Teachable接口并且是实现了work的方法体但是这种实现是通过回调外部类中定义的teach方法来实现的。如果要实现外部类的对象具有教学的功能只需要内部类调用外部类定义的教学方法work即可,那这里就就自然涉及到要获得内部类的引用的方法了所以定义了getTeachable()方法这就是所谓的获得内部类的引用进而回调外部类的方法也就是开头讲到的闭包回调。
函数的入口:
public class MainClass {
/**
* @param args
*/
public static void main(String []args)
{
Teacher_Programmer t_p=new Teacher_Programmer("wangyong");
t_p.work();
t_p.getTeachable().work();
}
}