2

当我们有一个类的最终实例变量时,它是为该类创建的每个对象实例化还是只创建一次并引用?
如果最终变量是局部类变量会怎样?

4

4 回答 4

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字段初始值设定项,因此该代码将在第一次加载类时运行。因此,对于简单的程序,这将运行一次——在多个类加载器正在运行的场景中(例如应用程序服务器等),但是,每次将类加载到新的类加载器中时,这将运行一次。

于 2012-09-15T01:19:40.023 回答
3

最终变量为类的每个实例实例化。一旦分配给它们的值可能不会更改。这些变量可以通过初始化程序或赋值语句初始化一次。

您指的是静态变量。这些变量不附加到特定对象,而是附加到整个类。它们是在加载类时分配的。

将这两者结合在一起,您可以为该类提供一个静态最终变量。这基本上意味着一旦分配给变量的值是常量,并且它将附加到类而不是类的实例。

于 2012-09-15T01:14:44.347 回答
2

实例变量、类变量和局部变量用于指代三种不同的事物,因此将变量称为“类的实例变量”或“局部类变量”会造成混淆。

一个实例变量属于一个对象。无论是否final,都会在每个实例中为它分配空间。如果是final,则必须在构造过程中赋值,并且变量只能赋值一次。

一个类变量属于整个类。无论该类的对象数量如何,只有一个变量,并且所有实例都可以引用它。将变量声明为static意味着它属于该类。与实例变量一样,static可以声明类变量final。然后它必须在类初始化时被赋值一次且仅一次。

局部变量在方法中声明,并且该变量占用方法堆栈帧中的空间——尽管该变量可能持有指向堆中对象的指针。局部变量 can be final,这意味着它们只能被赋值一次。此外,如果局部变量是final,它可以被方法中实例化的内部类引用。

于 2012-09-15T01:21:55.390 回答
1

变量不是被实例化的变量。类被实例化。变量被初始化。实例变量必须在构造对象时初始化,如果是,final您将无法为它们重新分配值。如果它是一个实例变量,那么类的每个实例都会有它自己的副本,否则如果它是静态的,那么只有一个属于类本身的副本。

于 2012-09-15T01:16:11.960 回答