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

时间:2011-01-18 14:54:09

标签: java constants final inner-classes

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

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

4 个答案:

答案 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

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