匿名内部类和最终修饰符

为了我的理解,正确的anonymous classes永远是final

这已在JLS 15.9.5中具体提及

但是,当我运行下面的代码来检查它是否显示Inner类不是final

    public class Test{
    static class A<T> {
    }
    public static void main(String arg[]) {
        A<Integer> obj = new A() {
        };
        if ((obj.getClass().getModifiers() & Modifier.FINAL) != 0) {
            System.out.println("It is a final  " + obj.getClass().getModifiers());
        } else {
            System.out.println("It is not final " + obj.getClass().getModifiers());
        }
    }
}

以上程序的输出是:

It is not final 0

请清除我的疑问,因为我无法理解此行为。


Explicit是源代码中写的东西。 所以,如果某些东西被宣布为public final class ,那就意味着这个阶级显然是最终的。

隐式是在源代码中没有写下来的东西,但是在某个构造的上下文中或者基于语言规则,一个元素的行为就像使用指定的修饰符声明的那样。

例如,声明enum SomeEnum { }的关键字enum会导致SomeEnum成为final ,因为语言规则会规定它。 其效果与关键字final的效果相同。

匿名类的示例隐式地是最终的,因为没有语言结构存在来覆盖匿名类。 所以它的行为就像是final 。 我认为“有效”这个词在这里更好。


但是,你不能根据反射如何呈现事物来作出假设。 考虑下面的代码片段:

public class Test {
    interface SomeInterface { }
    abstract interface SomeAbstractInterface { }
    static abstract class SomeAbstractClass { }
    enum SomeEnum { }

    public static void main(String arg[]) {
        System.out.println(Modifier.toString(SomeInterface.class.getModifiers()));
        System.out.println(Modifier.toString(SomeAbstractInterface.class.getModifiers()));
        System.out.println(Modifier.toString(SomeAbstractClass.class.getModifiers()));
        System.out.println(Modifier.toString(SomeEnum.class.getModifiers()));
    }
}

结果是这样的:

abstract static interface
abstract static interface
abstract static
static final

interfaceabstract interface都被认为是一个抽象接口。 他们也被认为是静态的反思。 显然,在解析和编译Java源代码的过程中,可能会删除或添加一些修饰符。


我同意这可能被认为是一个错误,因为JLS中的其他情况表现出不同的行为。 恰当的例子是一个接口:根据第9.1.1.1节:

每个接口都是隐含abstract

而当运行下面的内容时:

interface X {
    void foo();
}

public static void main(String arg[]) {
    System.out.println(Modifier.isAbstract(X.class.getModifiers()));
}

它返回true。

另一个例子是JLS指定的枚举:

枚举声明是隐式final ,除非它包含具有类体至少一个枚举常量

下面的例子与它完全一致。

enum X {

}

public static void main(String arg[]) {
    System.out.println(Modifier.isFinal(X.class.getModifiers()));  // true
}

JLS 15.9.5“......隐式地最后”......但那不是“最终”,意思是说你不能扩展一个匿名类。 这个没有语法结构,但是这个类没有标记为final。

链接地址: http://www.djcxy.com/p/96657.html

上一篇: Anonymous Inner classes and Final modifier

下一篇: Disable auto text highlight input?