无法在内部类中声明Public static final String s = new String(“123”)

我试图声明一个类,如下所示

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编译。 如果我将整个常量声明放在外部类中它可以正常工作。 我错过了什么 有帮助吗?

阅读Java语言规范,第3版,第8.1.3节。

内部类是未显式或隐式声明为静态的嵌套类。 内部类可能不会声明静态初始化器(第8.7节)或成员接口。

这就是为什么你不能声明新的 public static final String s1 = new String("123");

内部类可能不会声明静态成员,除非它们是编译时常量字段(第15.28节)。

这解释了为什么你可以做public static final String s2 = "123";

静态嵌套类可以具有静态成员。

cf Java语言规范,第二版, §8.1.2

内部类是未显式或隐式声明为静态的嵌套类。 内部类可能不会声明静态初始化器(第8.7节)或成员接口

内部类被设计为在外部类的上下文中工作,我认为静态变量会破坏这个规则。

8.1.2内部类和封闭实例

内部类是未显式或隐式声明为静态的嵌套类。 内部类可能不会声明静态初始化器(第8.7节)或成员接口。 内部类可能不会声明静态成员,除非它们是编译时常量字段(第15.28节)。

试试这个,它在内部类中工作正常:

 public static final String s="123"; 

我不知道它被允许的原因。