匿名内部类、回调、和事件驱动

一、内部类的作用域:

(1)、一个内部类的对象能够访问创建它的对象的实现,包括私有数据。

(2)、内部类对于同一个包中的其它类来说,内部类能够被隐藏起来。内部类不管方法的可见性如何,哪怕是public 的其它类都无法使用它。

(3)、内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。

(4)、外部类可以直接使用内部类的对象。

        pouter po = new pouter();
        pouter.pinner pi = po.new pinner();
        pi.Print();

二、java回调机制:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回 调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。
回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

回调函数:有点像您随身带的BP机:告诉别人号码,在它有事情时Call您
回调用于层间协作,回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
应用:在Java中,通常就是编写另外一个类或类库的人规定一个接口,然后你来实现这个接口,然后把这个接口的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。

eg:

ExecutorService pool = Executors.newFixedThreadPool(2);  //线程池
  for (int i = 0; i < files.size(); i++) {
   final File file = (File) files.get(i);
   pool.execute(new Runnable() {
    public void run() {
           doSomething();

    }
   });
  }
  pool.shutdown();

 

JDK 定义了一个接口  Runnable,我实现了这个接口的方法,然后又把这个接口的引用传递给JDK。

 

自己写一个简单的回调例子

1)、定义回调函数接口

public interface CallBack(){

      public void execute();

}

 

2)、定义外部类实现方法

OutClass:

pubic void testOut(CallBack callBack){

      ...........

       callBack.execute();   //(属于底层调用)

      ...........

 

}

 

public void main(String[] args){

     OutClass out = new OutClass();

     out.testOut(new CallBack(){

               public void execute(){

                    //我需要实现的东西,(属于高层实现)

               }

     });

}

 

三、 事件驱动编程模型

事件驱动,是指Java应用能够对某些事件作出响应。发出事件的对象称为事件源,对事件感兴趣的对象,称为监听器。事件驱动就是事件源发出事件,监听器捕获事件并作出响应的过程。

eg:

定义事件接口

public interface Event{

     public void  interEvent();

}

 

定义两个具体事件

public class PrintEvent implements Event{

     public PrintEvent(){}

 

     public interEvent(){

              System.out.println("发生了打印事件");

    }

}

 

public class QueryEvent implements Event{

     public QueryEvent(){}

 

     public interEvent(){

              System.out.println("发生了查询事件");

    }

}

 

定义监视器

public class EventMonitor{

     private   Event e;

     private   boolean somHapp;

     public EventMonitor(){

           somHapp= true;

     }

     public setEvent(Event e){

             this.e = e

    }

    public void doWork(){

         if(somHapp){

              e.interEvent();

         }

   }

}

 

测试

public static void main(String[] args) {
   QueryEvent qe = new QueryEvent ();
   PrintEvent  pe = new PrintEvent ();
   EventMonitor em = new EventMonitor();
   em .setEvent(qe );
   em .doWork();
   em .setEvent(pe );
   em .doWork();
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值