根据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!");
}
};
如果选择的话,为什么不允许我再次对其进行子类化?
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!");
}
};
我并不是说我一定要,或者甚至可以想到我这样做的原因。但是我很好奇为什么会这样。
好吧,能够继承一个匿名类将是毫无用处的。唯一可以引用匿名类的地方是在定义它的语句中(如您的假设伪代码示例所示)。这意味着将保证该程序永远不会创建匿名超类的任何实例,并且智能编译器应能够将这两个定义折叠为一个类。
实际上,当类为最终类时,编译器和VM可以自由地在调用站点内联其方法。因此,在自然不可能扩展给定类的任何情况下,使此类本质上成为最终类是有意义的。
问题内容: 就在今天,我需要一种在不同对象之间传递函数的方法。我很快了解到您不能直接在Java中做到这一点,但是您可以传递一个wht实例,该实例显然被称为“匿名内部类”,如下所示: 定义类: 使其成为一个实例: 并称之为: 很简单。但是我不明白的是为什么它被称为“匿名”。我不只是给它起名字MyCallback吗?命名的东西不能匿名,对吗?请避免对这个术语感到困惑。 问题答案: 不,您说的是MyCa
问题内容: 我对Java中的匿名类有什么误解。考虑以下简单示例: 演示 为什么要编译代码?在JLS,CHAPT 15 说: 匿名类始终是内部类(第8.1.3节);它永远不会是静态的 但是JLS,第8章 内部类是未显式或隐式声明为static的嵌套类。 因此,匿名类是内部类。但是我们在静态上下文中使用它们。为什么这里正确? 问题答案: 可以在静态上下文中创建类而无需将其声明为静态,这就是在这里发生的
我对Java中的匿名类有一个误解。考虑下面的简单例子: 演示 代码为什么编译?JLS,第15章说: 匿名类总是一个内部类(§8.1.3);它从来不是静态的 但是JLS,第8章 内部类是没有显式或隐式声明为静态的嵌套类。 所以匿名类是一个内部类。但是我们在静态上下文中使用它们。为什么这里是正确的?
我的问题是,匿名对象“referenceType”有什么魔力让它工作?如果我定义了一个“referenceType”的显式子类,并使用它来代替匿名样式,它就不会像预期的那样。 结果是:
问题内容: 在这里只能是最终的。为什么?如何在不保留为私有成员的情况下重新分配方法? 单击该如何返回? 问题答案: 如注释中所述,其中一些在Java 8中变得无关紧要,在Java 8中final可以隐式使用。但是,只能在匿名内部类或lambda表达式中使用有效的最终变量。 这基本上是由于Java管理闭包的方式。 创建匿名内部类的实例时,该类中使用的任何变量都将通过自动生成的构造函数复制其值。这样避
我通过在public static void main()方法中实现接口I创建了匿名类。因此,Java8对于抽象方法test()的实现是从C类的imple()方法中提供的。 因此,在public static void main()方法printing_interface.getclass(),我得到了 但最终它打印的是package_path.C(告诉我C是类名)。这怎么可能?不应该再次打印pa