final static array - 非典型的常量值

时间:2013-08-30 22:16:01

标签: java

我有一点非典型的静态常量值,我想用以下方式声明:

protected static final int[][] a = new int [][] { {34,16}, {50,16}, {66,16}, {82,16}, {98,16}, {114,16}};

不幸的是它被拒绝了。除非用常量表达式初始化,否则字段a不能在非静态内部类型中声明为静态。

为了完全确定我们对情况有相同的概述,它是内部阶级的领域。

我试图将其声明为

protected static final int[][] a = { {34,16}, {50,16}, {66,16}, {82,16}, {98,16}, {114,16}};

它既不起作用也不起作用。 :(

即使我尝试使用静态初始化程序,也是同样的故事:

protected static final int[][] a;
static { a = new int [][] { {34,16}, {50,16}, {66,16}, {82,16}, {98,16}, {114,16}}};

当我删除新的int [] []时,它被拒绝了。

为什么它不起作用?当然,我可以跳过静态并将其作为非静态字段,但如果它是一个常量值,为什么不使它静止?

3 个答案:

答案 0 :(得分:0)

根据JLS §8.1.3

不允许这样做
  

内部类可能不会声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。

您声明的int[][] a不是常量变量,因为它未使用常量表达式初始化(​​请参阅JLS §15.28)。例如,如果aStringint,并且使用文字初始化,那么它就是有效的。

答案 1 :(得分:0)

看起来你有类似的东西:

class inner{
protected static final int[][] a = { {34,16}, {50,16}, {66,16}, {82,16}, {98,16}, {114,16}};
}

您可以直接删除静态访问a

class inner{
    protected final int[][] a = { {34,16}, {50,16}, {66,16}, {82,16}, {98,16}, {114,16}};
    }

内部类只能有静态常量字段。

答案 2 :(得分:0)

According to the JLS, a constant expression is

  

编译时常量表达式是表示值的表达式   原始类型或不突然完成的字符串,是   仅使用以下内容撰写:

     

...

你有什么

new int [][] { {34,16}, {50,16}, {66,16}, {82,16}, {98,16}, {114,16}};

不是常量表达式。