当我们有一个类的最终实例变量时,它是为该类创建的每个对象实例化还是只创建一次并引用?
如果最终变量是局部类变量会怎样?
4 回答
final
修饰符只是表明该变量可以被赋值一次,并且不能再被赋值。它对实例化没有影响;规则与普通变量相同。修饰符所做的final
只是防止该值被第二次分配。
下面的例子。
private final List myList = new ArrayList();
每次运行时都会实例化该列表,即每次实例化封闭类时。
public void bob() {
final List myList = new ArrayList();
}
该列表将在每次运行时实例化,即每次bob
调用该方法时。
private static final List MY_LIST = new ArrayList();
同样,每次运行时都会实例化该列表。由于这也是一个static
字段初始值设定项,因此该代码将在第一次加载类时运行。因此,对于简单的程序,这将运行一次——在多个类加载器正在运行的场景中(例如应用程序服务器等),但是,每次将类加载到新的类加载器中时,这将运行一次。
最终变量为类的每个实例实例化。一旦分配给它们的值可能不会更改。这些变量可以通过初始化程序或赋值语句初始化一次。
您指的是静态变量。这些变量不附加到特定对象,而是附加到整个类。它们是在加载类时分配的。
将这两者结合在一起,您可以为该类提供一个静态最终变量。这基本上意味着一旦分配给变量的值是常量,并且它将附加到类而不是类的实例。
实例变量、类变量和局部变量用于指代三种不同的事物,因此将变量称为“类的实例变量”或“局部类变量”会造成混淆。
一个实例变量属于一个对象。无论是否final
,都会在每个实例中为它分配空间。如果是final
,则必须在构造过程中赋值,并且变量只能赋值一次。
一个类变量属于整个类。无论该类的对象数量如何,只有一个变量,并且所有实例都可以引用它。将变量声明为static
意味着它属于该类。与实例变量一样,static
可以声明类变量final
。然后它必须在类初始化时被赋值一次且仅一次。
局部变量在方法中声明,并且该变量占用方法堆栈帧中的空间——尽管该变量可能持有指向堆中对象的指针。局部变量 can be final
,这意味着它们只能被赋值一次。此外,如果局部变量是final
,它可以被方法中实例化的内部类引用。
变量不是被实例化的变量。类被实例化。变量被初始化。实例变量必须在构造对象时初始化,如果是,final
您将无法为它们重新分配值。如果它是一个实例变量,那么类的每个实例都会有它自己的副本,否则如果它是静态的,那么只有一个属于类本身的副本。