当前位置:编程学习 > JAVA >>

Java匿名内部类的理解——“他爸是李刚”

最近学习Android里用到的监听器。监听器主要是两部分:一个是监听什么,一个是间听到以后干嘛,后者也被称作callback(翻译成回调)。然后一下子想远了......
内部类就是写(定义)在一个类的内部的类代码。这部分代码其实可以看成是外部类方法中的一个表达式,在表达式中,你当然可以使用所有其外部类的成员。
内部类既然是一个类,它必然有它自己的成员和方法。而且,其它类如果要使用它,也必须要先new一个实例出来。你可以给这个实例起一个好记的名字,然后在你需要的时候通过点操作符来使用类中定义的成员和方法。
但是,有时候这个实例只用一次就不用了。比如在监听器(或者称为callback)里面,当监听到特定事件发生时才执行一次callback里定义的方法,你不知道这个事件多久才发生一次。那么这个callback实例其实没有必要长期留在内存里,相反只需要在事件发生时临时再去实例化就好。换个角度说,一个类,它总是在需要的时候临时才去实例化,然后使用里面的方法。这时,这个类可以省掉名字了。没别的原因,就是可以省去想一个类名(好的类名真是越来越不好起了)的麻烦。打个比方,你可以先定一个类叫MyObj,在里面定义一个方法叫run();然后你实例化它:MyObj myObj=new MyObj(); 然后在任何表达式里面调用方法myObj.run()来做点什么。
其实,你也可以这样:前面的都省了,直接在需要的时候用new MyObj().run();来做同样的事。等等,好像不行,因为前面都省了,那run()方法具体该做什么都不知道啊?所以,要把run()方法的具体实现写出来。用new MyObj(){public run(){//do something};};来做同样的事。当然,你会发现类的名字还在那儿啊!MyObj不就是类的名字吗?你说得对。那么接下来我们看一下这个类名是不是可以不要。run()方法做的事情并不是事先在MyObj里面定义的,那MyObj类里面还有啥?啥也没有!那留它何用?最好是连名字都不要了。这就出现了匿名类。
匿名类就有新的问题来了。连名字都没有了,那new的时候,new空气啊?目前只有一个办法了:匿名类必须继承父类或者接口,而且这个父类还必须是Abstract(抽象)类。因为里面的方法要留到需要的时候才临时去实现。这样的话,匿名类在使用时,其实new的是它爹。所以上面写的还得改一改才对,应该写成new Obj(){public run(){//do something};};才对。Obj是MyObj的父类,它有个抽象方法run();只是起了名字,等你用的时候再自己去实现。当然,匿名类也可以implement自某个接口。接口就更不用说了,里面的方法都是抽象的,写不写Abstract都一样。接口定义的方法都只能留到其实现类里面去写了。正因为“匿名类必须继承父类或者接口”,在多线程的实现上经常使用它,因为要实现多线程必须继承Thread类或Runnable接口。
最后一个问题,匿名类一定是内部类吗?废话,名字都没有,你想新建一个class也没法新建啊?所以匿名类就只有像表达式一样写在其外部类的“字里行间”才行了。从此它就被叫做匿名内部类了。
最最后的废话,如果你老记不住匿名内部类的来历,你就想“他爸是李刚”:咱完全不鸟他的名字,咱只关心他做了啥坏事和他爸的名字。 Java callback 匿名内部类
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,