在构造函数中初始化静态final字段

Yar*_*evi 80 java static constructor final

public class A 
{    
    private static final int x;

    public A() 
    {
        x = 5;
    }
}
Run Code Online (Sandbox Code Playgroud)
  • final 表示变量只能分配一次(在构造函数中).
  • static 意味着它是一个类实例.

我不明白为什么这是禁止的.这些关键字在哪里相互干扰?

ada*_*shr 175

每次创建类的实例时都将调用构造函数.因此,上面的代码意味着每次创建实例时都会重新初始化x的值.但是因为变量被声明为final(和static),所以你只能这样做

class A {    
    private static final int x;

    static {
        x = 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你删除静态,你可以这样做:

class A {    
    private final int x;

    public A() {
        x = 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

或这个:

class A {    
    private final int x;

    {
        x = 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 显然没有人愿意解释静态变量是存在于类的所有实例中的变量.因此,它们只能在加载类时实例化一次 - 而不是在构造类的许多实例时. (17认同)

Sea*_*oyd 16

加载类时初始化静态最终变量.构造函数可以稍后调用,或者根本不调用.此外,构造函数将被多次调用(每个新对象),因此该字段不再是最终的.

如果需要自定义逻辑来初始化静态最终字段,请将其放在静态块中

  • @YaronLevi他刚刚说过......静态字段是类本身的成员.在构造函数中,您要为变量赋值.单词final意味着你只能为变量赋值一次,在你的代码中,每次实例化类时你都要为变量赋值 - 因为变量是静态的(类的成员).如果你摆脱静态,那么你可以在构造函数中为它赋值,因为它每次都是一个新变量.如果你摆脱了final,那么它只是一个静态变量,你可以随时为它赋值. (3认同)

rfe*_*eak 6

想想第二次实例化对象时会发生什么.它试图将它设置为AGAIN,这是一个静态的决赛明确禁止的.它只能为整个类设置一次,而不是实例.

您应该在声明时设置该值

private static final x=5;
Run Code Online (Sandbox Code Playgroud)

如果您需要其他逻辑或更复杂的实例化,可以在静态初始化程序块中完成.


小智 5

static表示变量在应用程序上是唯一的. final意味着它应该只设置一次.

如果在构造函数中设置它,则允许多次设置变量.

因此,您应该直接初始化它或提出一个静态方法来初始化它.