我试图声明一个类,如下所示
class Outer{
private final class Inner{
public static final String s1 = new String("123");
public static final byte[] bytes = new byte[]{0x00, 0x01};
public static final String s2 = "123";
public static final byte byte1 = 0x02;
}
}
在上面的代码中,s1和bytes不会编译,但是s2和byte1编译。如果我将整个常量声明放在外部类中它可以正常工作。我错过了什么有什么帮助吗?
答案 0 :(得分:12)
阅读Java语言规范,第3版,第8.1.3节。
内部类是一个非显式或隐式的嵌套类 声明静态。内部类可能不会声明静态初始化器(第8.7节)或 成员接口。
这就是您无法声明 new public static final String s1 = new String("123");
。
内部类可能不会声明静态成员,除非它们是编译时 常数场(§15.28)。
这解释了为什么你可以public static final String s2 = "123";
静态嵌套类可以有静态成员。
答案 1 :(得分:0)
参见Java语言规范,第二版,§8.1.2
内部类是一个嵌套类 没有明示或暗示 声明静态。内部课程可能没有 声明静态初始化器(第8.7节)或 成员接口
答案 2 :(得分:0)
内部类被设计为在外部类的上下文中工作,我认为静态变量会破坏这个规则。
8.1.2 Inner Classes and Enclosing Instances
内部类是一个嵌套类 没有明示或暗示 声明静态。内部课程可能没有 声明静态初始化器(第8.7节)或 成员接口。内部课程可以 不要声明静态成员,除非 它们是编译时常量字段 (§15.28)。
答案 3 :(得分:0)
试试这个,它在内部类中工作正常:
personName
我不知道它被允许的原因。