关于java中的匿名内部类,首先需要理解它的双重身份,一是匿名,二是内部类。
1.匿名类其实不应该说是一个类,而是一个对象,就是直接通过new 关键字生成的一个对象,它的主要特点:没有名字,在java中,对象的名字就是它的一个引用,没有名字,也就意味着别的地方没法引用它,所以它相当于一个临时的对象,用完以后就销毁了。
2.内部类指的是在一个类的内部又定义了一个类,内部类的主要特点是只能被它的外部类所知悉,而不能被外面的其他类知悉。它的主要目的是为了让代码更佳紧凑。也就是当一个类只需要被它的外部类使用,而不需要在其他的地方使用的时候,就可以创建一个内部类。最常用的一种情况是:类A需要使用一个类B的对象,而类B中又要调用类A的成员变量。这是就可以把类B当成类A的内部类。内部类可以定义在类中的任何地方。
3.匿名内部类
匿名内部类就是既是匿名类又是内部类的类。它其实很常用,比如下面这串代码就是一种常见的匿名内部类的用法。
loginBtn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
mDialog = new ProgressDialog(LoginActivity.this);
mDialog.setTitle("登录");
mDialog.setMessage("正在登录服务器,请稍候……");
mDialog.show();
Thread loginThread = new Thread(new LoginThread());
loginThread.start();
}
});
这串代码用匿名的内部类的方法实现了一个叫做OnClickListener()的接口,并且重写了父类的方法,这种代码在java中非常常见。
下面是一个简单的例子。
public class MainClass {
public void method(IA ia) {
ia.test();
}
public static void main(String[] args) {
MainClass mc = new MainClass();
mc.method(new IA() {
@Override
public void test() {
System.out.println("重写内部类的test方法。");
}
});
}
}
interface IA {
void test();
}