Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
5年前关闭。
我们知道在类加载时会为静态变量分配内存。最终的非静态变量也是如此。我知道在该类的每个实例中都将存在一个最终变量的新副本。我认为,最终非静态变量的第一个副本将在类加载本身时创建。请解释
因此,没有理由在实例的其余部分之前设置最终字段。它的分配方式与非最终字段完全相同。唯一的区别是不能再次分配它。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
5年前关闭。
我们知道在类加载时会为静态变量分配内存。最终的非静态变量也是如此。我知道在该类的每个实例中都将存在一个最终变量的新副本。我认为,最终非静态变量的第一个副本将在类加载本身时创建。请解释
最佳答案
确实,静态字段的内存是在类加载时分配的。或者更确切地说,在类链接阶段,与加载分开。
但这与最终的非静态字段无关。
首先,您无法为某个字段“分配”内存,而不能为其所属的整个对象分配内存。该字段将成为对象的一部分。一旦使用new
运算符,将仅为该对象分配空间。
但是也许您认为它的值将在类加载期间预先准备好,然后在创建新实例后立即复制到新实例中?
考虑以下情况:
class A {
private final int myInt;
public A( int valueForMyInt ) {
myInt = valueForMyInt;
}
// Other constructors and methods
}
myInt
的值在构造期间设置。字段为final的事实并不意味着在所有实例中其所有副本都是相同的。您可以使用常量初始化程序,初始化块或在构造函数中初始化final字段,并且它们在其中设置的值不必对于每个实例都相同。您可以使用new A(15)
,new A(27)
或所需的任何整数创建新实例。因此,没有理由在实例的其余部分之前设置最终字段。它的分配方式与非最终字段完全相同。唯一的区别是不能再次分配它。