new ActionListener(){} 相当于动态的实现了接口,在内存中建立了一个ActionListener对象,
区别就是这个对象的实现类就直接在另一个代码中定义了,而不是独立的文件。
我们一般称这种类为匿名类,当然,匿名类不止实现接口这一种。比如 一个接口 A ,里面有一个方法fun1(),一般我们是先定义它的实现再引用它,比如
public class ImpA implements A{
public void fun1(){
//do some thing...
}
}
然后在另一个类调用
public class Class1 {
public void method1(){
A a = new ImpA();
}
}
但有时我想对这个接口做另一个实现不想使用ImpA,但由于是临时的又不想去做定义,则你就可以这样
public class Class1 {
public void method1(){
A a = new A(){ //相当于在内存中直接产生了一个接口的实现并引用这个内存对象。动态的代码
public void fun1(){
//do some thing...
}
};
}
}
回调函数中出现的匿名类:
一个函数实现相同功能但更灵活:
首先定一个回调接口:
java 代码
public class TestObject {
/**
* 一个用来被测试的方法,进行了一个比较耗时的循环
*/
public static void testMethod(){
for ( int i= 0 ; i< 100000000 ; i++){
}
}
}
然后再写一个工具类:
java 代码
public class Tools {
/**
* 测试函数使用时间,通过定义CallBack接口的execute方法
* @param callBack
*/
public void testTime(CallBack callBack) {
long begin = System.currentTimeMillis(); //测试起始时间
callBack.execute(); ///进行回调操作
long end = System.currentTimeMillis(); //测试结束时间
System.out.println("[use time]:" + (end - begin)); //打印使用时间
}
public static void main(String[] args) {
Tools tool = new Tools();
tool.testTime(new CallBack(){
//定义execute方法
public void execute(){
//这里可以加放一个或多个要测试运行时间的方法
TestObject.testMethod();
}
});
}
}