无法在内部类中声明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";
我不知道它被允许的原因。