内部类的例子:容器里的迭代器、链表里面的节点。
内部类可以写在外部类的任意位置,如成员位置,方法内部。
为什么引入内部类?
- 补足多重继承
java类只能单继承,一个类的内部如果还可以定义类,内部类就可以继续继承。
解决父类和接口方法重名可能的冲突。 - 闭包
一个函数的“自由变量”就是既不是参数也不是局部变量的变量。
外部环境持有内部函数所依赖的自由变量,就对内部函数形成了闭包。 - 利用回调传递代码
更简单的写法是利用Lambda表达式。
如果我们要测试一个类的方法的执行时间,通常我们会这样做。缺点是代码是写死的。
使用匿名内部类实现代码传递,增加代码的灵活性:public class TestObject { /** * 一个用来被测试的方法,进行了一个比较耗时的循环 */ public static void testMethod() { for (int i = 0; i < 100000000; i++) {} } /** * 一个简单的测试方法执行时间的方法 */ public void testTime() { long begin = System.currentTimeMillis(); //测试起始时间 testMethod(); //测试方法 long end = System.currentTimeMillis(); //测试结束时间 System.out.println("[use time]:" + (end - begin)); //打印使用时间 } public static void main(String[] args) { TestObject test = new TestObject(); test.testTime(); } }
public interface CallBack { //执行回调操作的方法 void execute(); }
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() { //这里可以加放一个或多个要测试运行时间的方法 for (int i = 0; i < 100000000; i++) {} } }); } }
网友评论