1

我有一个不典型的静态常量值,我想通过以下方式声明它:

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[][] 时也是如此。

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

4

3 回答 3

0

根据JLS §8.1.3是不允许的:

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

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

于 2013-08-30T22:21:58.447 回答
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}};
    }

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

于 2013-08-30T22:22:30.143 回答
0

根据 JLS,一个常量表达式是

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

...

你有什么

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

不是常量表达式。

于 2013-08-30T22:23:09.303 回答