一、内部类的作用域:
(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();
}