现在的位置: 首页Java>正文
匿名内部类、回调、和事件驱动
2014年04月09日 Java 暂无评论 ⁄ 被围观 2,556 views+

java-black-

一、内部类的作用域:

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

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

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

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

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

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

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

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

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应用能够对某些事件作出响应。发出事件的对象称为事件源,对事件感兴趣的对象,称为监听器。事件驱动就是事件源发出事件,监听器捕获事件并作出响应的过程。

定义事件接口

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();
}



给我留言

留言无头像?


无觅相关文章插件,快速提升流量