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

public class A { private static final int x; public A() { x = 5; } } 
  • final意味着variables只能被赋值一次(在构造函数中)。
  • static意味着它是一个类实例。

我看不出为什么这是禁止的。 这些关键字在哪里互相干扰?

每次创build类的实例时都会调用构造函数。 因此,上面的代码意味着x的值将在每次创build实例时重新初始化。 但是因为variables被声明为final(而且是静态的),所以你只能这样做

 class A { private static final int x; static { x = 5; } } 

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

 class A { private final int x; public A() { x = 5; } } 

或这个:

 class A { private final int x; { x = 5; } } 

当类被加载时,静态的最终variables被初始化。 构造函数可能会稍后调用,或根本不调用。 另外,构造函数将被多次调用(每个新对象),所以这个字段不再是最终的。

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

想想第二次实例化一个对象会发生什么。 它试图将其重新设置,这是静态决赛明确禁止的。 它只能为整个class级设定一次,而不是实例。

您应该在声明时设置该值

 private static final x=5; 

如果您需要额外的逻辑或更复杂的实例化,可以在静态初始化块中完成。

static意味着该variables在应用程序上是唯一的。 final意味着它应该只设置一次。

如果您在构造函数中设置它,则允许多次设置该variables。

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

最后并不意味着必须在构造函数中初始化。 一般来说这是做什么的:

  private static final int x = 5; 

静态的意思是variables将通过类的多个实例共享。 例如 :

 public class Car { static String name; public Car(String name) { this.name = name; } } ... Car a = new Car("Volkswagen); System.out.println(a.name); // Produces Volkswagen Car b = new Car("Mercedes"); System.out.println(b.name); // Produces Mercedes System.out.println(a.name); // Produces Mercedes 

得到它了?

想想看。 你可以用你的代码做到这一点:

 A a = new A(); A b = new A(); // Wrong... x is already initialised 

初始化x的正确方法是:

 public class A { private static final int x = 5; } 

要么

 public class A { private static final int x; static { x = 5; } }