相关疑难解决方法(0)

Anonymous-Inner类显示不需要的修饰符

据我了解,下面的代码应该打印出来true.

但是,当我运行此代码时,它正在打印false.

来自匿名类的 Java文档 15.9.5.:

匿名类总是隐式最终的

public class Test {
    public static void main(String args[]) {
        Object o = new Object() {
        };
        System.out.println("Annonymous class is final: " + Modifier.isFinal(o.getClass().getModifiers()));
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解这种行为.

java final anonymous-class jls

45
推荐指数
3
解决办法
1742
查看次数

为什么所有匿名类都隐式最终?

根据JLS:

15.9.5匿名类声明编译器自动从类实例创建表达式派生匿名类声明.

匿名类永远不是抽象的(第8.1.1.1节).匿名类始终是内部类(第8.1.3节); 它永远不会是静态的(§8.1.1,§8.5.2). 匿名类总是隐式最终的(§8.1.1.2).

这似乎是一个特定的设计决定,所以它有可能有一些历史.

如果我选择这样的课程:

SomeType foo = new SomeType() {
    @Override
    void foo() {
        super.foo();
        System.out.println("Hello, world!");
    }
};
Run Code Online (Sandbox Code Playgroud)

如果我选择的话,为什么我不允许再次继承它?

SomeType foo = new SomeType() {
    @Override
    void foo() {
        super.foo();
        System.out.println("Hello, world!");
    }
} {
    @Override
    void foo() {
        System.out.println("Hahaha, no super foo for you!");
    }
};
Run Code Online (Sandbox Code Playgroud)

我不是说我一定想要,或者甚至可以想到我会这样做的原因.但我很好奇为什么会这样.

java final anonymous-class

6
推荐指数
1
解决办法
650
查看次数

标签 统计

anonymous-class ×2

final ×2

java ×2

jls ×1