匿名内部类
匿名内部类是一种内部类,使用单个语句声明和实例化。因此,该类的其他地方没有名称可供使用; 即它是匿名的。
匿名类通常用于需要能够创建轻量级类作为参数传递的情况。这通常通过界面完成。例如:
public static Comparator<String> CASE_INSENSITIVE =
new Comparator<String>() {
@Override
public int compare(String string1, String string2) {
return string1.toUpperCase().compareTo(string2.toUpperCase());
}
};
这个匿名类定义了一个 Comparator<String>
对象(CASE_INSENSITIVE
),用于比较两个字符串,忽略大小写的差异。
经常使用匿名类实现和实例化的其他接口是 Runnable
和 Callable
。例如:
// An anonymous Runnable class is used to provide an instance that the Thread
// will run when started.
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world");
}
});
t.start(); // Prints "Hello world"
匿名内部类也可以基于类。在这种情况下,匿名类隐含地显示现有类。如果要扩展的类是抽象的,那么匿名类必须实现所有抽象方法。它也可能会覆盖非抽象方法。
构造函数
匿名类不能有显式构造函数。相反,定义了一个隐式构造函数,它使用 super(...)
将任何参数传递给正在扩展的类中的构造函数。例如:
SomeClass anon = new SomeClass(1, "happiness") {
@Override
public int someMethod(int arg) {
// do something
}
};
我们的 SomeClass
的匿名子类的隐式构造函数将调用与调用签名 SomeClass(int, String)
匹配的 SomeClass
的构造函数。如果没有可用的构造函数,则会出现编译错误。隐式构造函数也会抛出匹配的构造函数抛出的任何异常。
当然,扩展接口时这不起作用。当你从接口创建匿名类时,类超类是 java.lang.Object
,它只有一个 no-args 构造函数。