我有一点非典型的静态常量值,我想用以下方式声明:
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 [] []时,它被拒绝了。
为什么它不起作用?当然,我可以跳过静态并将其作为非静态字段,但如果它是一个常量值,为什么不使它静止?
答案 0 :(得分:0)
根据JLS §8.1.3:
不允许这样做内部类可能不会声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。
您声明的int[][] a
不是常量变量,因为它未使用常量表达式初始化(请参阅JLS §15.28)。例如,如果a
是String
或int
,并且使用文字初始化,那么它就是有效的。
答案 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}};
不是常量表达式。