在构造函数中初始化静态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; } }