package com.static2;
public class Static {
final static int y;
{
y=8;// error: the value cant be initialized
}
}
我们可以访问非静态块中的静态成员,但为什么我们不能访问非静态块中的静态最终成员?
答案 0 :(得分:5)
为类的每个实例执行一个实例初始化程序块(在您的示例中就是您所拥有的),这意味着您的final static
变量将被多次初始化(每个实例一次)。 final
变量不允许这样做。
答案 1 :(得分:0)
变量y
是static
和final
。
static
关键字使变量成为类的成员,因此不需要创建类的对象以访问静态变量。final
关键字只允许变量初始化一次您已声明static final
变量但未初始化它。这只能初始化;
静态初始化程序块的定义与实例初始化程序相同,但前面带有关键字static
;
static {
// code
}
在编译并运行类时,静态初始化程序仅插入内存一次。
您已在实例初始化程序中初始化变量y
。每次创建Static
对象时都会运行此代码块。
因此,您的代码无法编译的原因是因为每次创建类的对象时,final
变量y
都可以重新赋值(尽管值相同)到值8
如果变量必须是final,则创建一个静态初始化器;
final static int y;
static {
y = 8;
}
或者将final
,static
或两个关键字放在变量声明中,并按原样保留实例初始化程序;
int y;
{
y = 8;
}
static int y;
{
y = 8;
}
final int y;
{
y = 8;
}