匿名内部类

匿名内部类是一种内部类,使用单个语句声明和实例化。因此,该类的其他地方没有名称可供使用; 即它是匿名的。

匿名类通常用于需要能够创建轻量级类作为参数传递的情况。这通常通过界面完成。例如:

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),用于比较两个字符串,忽略大小写的差异。

经常使用匿名类实现和实例化的其他接口是 RunnableCallable。例如:

// 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 构造函数。