蚂蚁最近在学习Java和Android时,遇到了一个匿名内部类语法的使用问题。
很多书籍,包括网络,都有特别指出:匿名内部类必须在抽象类或接口的基础上,才可以定义。
比如:
interface AnInterface{
void info();
}
abstract class AnAbstractClass{
abstract void info();
}
完全可以使用匿名内部类语法:
public class Test {
public static void main(String[] args) {
AnAbstractClass aac = new AnAbstractClass() {
@Override
void use(){
;
}
};
AnInterface ai = new AnInterface() {
@Override
public void info() {
;
}
};
}
}
但是查阅权威书籍**《Thinking in Java》**Fourth Edition后,发现该书中提到,这种语法它指的是“创建一个继承自父类的匿名类的对象”。也就是说,即便是一个普通类,也是可以使用这种语法的。
实际代码测试:
class PureClass {
//方法体为空,子类可根据具体需求,具体实现此方法。
void show(){
}
}
public class Test {
public static void main(String[] args) {
PureClass pure = new PureClass(){
@Override
void show(){
System.out.println(“具体实现,覆写了父类PureClass的show方法。”);
}
};
pure.show();
}
}
以上代码,编译运行正常。我们可以看到,PureClass只是一个普通类,既不是抽象类,也并非接口。而我们的匿名抽象类这种语法,依然可以正常使用。
另一个引发我对这个语法进行思考的,是android.os.Handler类。进入SDK,查阅Handler的源代码,我们会看到类名和方法的具体定义:
public class Handler {
/**
* Subclasses must implement this to receive messages.
*/
public void handleMessage(Message msg) {
}
}
Handler类既不是抽象类,也不是接口,但我们在安卓中使用Handler进行信息传递时,需要覆写handleMessage方法:
Handler handle = new Handler(){
@Override
public void handleMessage(Message msg){
//具体操作代码省略
}
};
当然,蚂蚁的思考,也有可能有不正确的地方,还请各位前辈和朋友们,多多指点。