为什么我不能在非静态块中声明静态最终变量?

时间:2016-11-10 18:34:20

标签: java

package com.static2;

public class Static {

  final static int y;

    {
        y=8;// error: the value cant be initialized

    }
}

我们可以访问非静态块中的静态成员,但为什么我们不能访问非静态块中的静态最终成员?

2 个答案:

答案 0 :(得分:5)

为类的每个实例执行一个实例初始化程序块(在您的示例中就是您所拥有的),这意味着您的final static变量将被多次初始化(每个实例一次)。 final变量不允许这样做。

答案 1 :(得分:0)

变量ystaticfinal

  • static关键字使变量成为类的成员,因此不需要创建类的对象以访问静态变量。
  • final关键字只允许变量初始化一次

您已声明static final变量但未初始化它。这只能初始化;

  1. 在声明中
  2. 在静态初始化程序块中
  3. 静态初始化程序块的定义与实例初始化程序相同,但前面带有关键字static;

    static {
        // code
    }
    

    在编译并运行类时,静态初始化程序仅插入内存一次。

    您已在实例初始化程序中初始化变量y。每次创建Static对象时都会运行此代码块。

    因此,您的代码无法编译的原因是因为每次创建类的对象时,final变量y都可以重新赋值(尽管值相同)到值8

    如果变量必须是final,则创建一个静态初始化器;

    final static int y;
    static {
        y = 8;
    }
    

    或者将finalstatic或两个关键字放在变量声明中,并按原样保留实例初始化程序;

    int y;
    {
        y = 8;
    }
    
    static int y;
    {
        y = 8;
    }
    
    final int y;
    {
        y = 8;
    }