匿名内部类和最终修饰符
为了我的理解,正确的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
interface
和abstract 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