考虑这段代码:
public class TopLevelClass {
Cloneable c = new Cloneable() {
private int privateField;
private void privateMethod() {};
};
}
有一个匿名类有一个 private
会员字段和 private
成员方法。它已成功编译。
然后考虑这个:
public class TopLevelClass {
Cloneable c = new Cloneable() {
private class PrivateInnerClass {}
};
}
有一个匿名类有一个 private
会员班。然而...
- javac说:
error: modifier private not allowed here
- Eclipse说:
Illegal modifier for the local class PrivateInnerClass; only abstract or final is permitted
真的是本地班吗?
什么? 为什么匿名类不能拥有 public
, protected
要么 private
(以下简称 those
) 他们可以拥有的成员课程 those
会员字段和方法? 困惑,我看着JLS。因为Eclipse所说的,我调查了一下 当地的课程 第一:
14.3。本地类声明
一个 当地班级 是一个嵌套类(§8)这不是任何类的成员,并且具有名称(6.2节, §6.7)。
如果本地类声明包含任何访问修饰符,则为编译时错误public
,protected
, 要么private
(6.6节),或修饰语static
(§8.1.1)。
所以当地的班级不能拥有 those
改性剂。但 PrivateInnerClass
是 一个匿名的成员 Cloneable
,所以它不是本地类,仍然能够拥有 those
改性剂。
然后我调查了一下 类修饰符:
8.1.1。类修饰符
访问修饰符
public
(6.6节)仅适用于顶级课程(第7.6节)和成员班(8.5节),而不是当地的课程(§14.3)或匿名课程(§15.9.5)。
访问修饰符protected
和private
(6.6节)仅适用于直接封闭类或枚举声明中的成员类(8.5节)。
但 PrivateInnerClass
是一个成员类,它在一个直接封闭的类中,匿名 Cloneable
,所以它仍然可以 those
理论上的修饰语。我也查看了其他部分,但我仍然找不到相关条款。
因此,Java语言规范的哪一部分表示匿名类的成员类不能拥有 those
修改?
额外注1: 一些答案争论成员类和本地类,所以我做了一个测试,可以得出结论(除非修饰符很重要):
- 匿名
Cloneable
是 既不是会员阶级也不是地方阶级。 - 该
PrivateInnerClass
是一个成员类,但是 不是当地的一个班级。
以下是我的测试代码:
public class TopLevelClass {
Cloneable c = new Cloneable() {
class PrivateInnerClass {}
};
public static void main(String[] args) throws ClassNotFoundException {
Class<?> c1 = Class.forName("TopLevelClass$1");
Class<?> c2 = Class.forName("TopLevelClass$1$PrivateInnerClass");
System.out.println(c1.isMemberClass()); // false
System.out.println(c1.isLocalClass()); // false
System.out.println(c2.isMemberClass()); // true
System.out.println(c2.isLocalClass()); // false
}
}
额外注2: 检查正常班级的声明(JLS§8.1):
NormalClassDeclaration: ClassModifiers选择 class Identifier TypeParameters选择 超选择 接口选择 ClassBody
在我的理解中,当 Identifier
class是一个XXX类,什么 §8.1.1 陈述是限制的修饰语 Identifier
,而不是其他声明中的修饰语 ClassBody
的 Identifier
。否则,匿名类甚至不能拥有 those
成员字段和方法。
任何答案,尤其是不同意Extra Note 2的答案,必须指出原因 those
允许使用成员字段和方法。
额外注3: 如果您认为JLS没有这样的部分, 你还需要提供一份可靠的文件来解释原因 those
成员类是禁止的,为什么 those
允许使用成员字段和方法。