gpt4 book ai didi

java - 静态变量什么时候初始化?

转载 作者:IT老高 更新时间:2023-10-28 13:51:13 27 4
gpt4 key购买 nike

我想知道静态变量何时初始化为其默认值。加载类时创建(分配)静态变量是否正确,然后执行声明中的静态初始化程序和初始化?在什么时候给出默认值?这就导致了前向引用的问题。

如果您可以引用 Why static fields are not initialized in time? 上提出的问题来解释这一点,也请您解释一下。尤其是 Kevin Brock 在同一站点上给出的答案。第三点看不懂。

最佳答案

来自 See Java Static Variable Methods :

  • It is a variable which belongs to the class and not to object(instance)
  • Static variables are initialized only once , at the start of the execution. These variables will be initialized first, before the initialization of any instance variables
  • A single copy to be shared by all instances of the class
  • A static variable can be accessed directly by the class name and doesn’t need any object.

如果您未能有意初始化实例和类(静态)变量,它们将自动初始化为标准默认值。虽然局部变量不会自动初始化,但您不能编译无法初始化局部变量或在使用之前为该局部变量赋值的程序。

编译器实际上做的是在内部生成单个类初始化例程,该例程将所有静态变量初始化器和所有静态初始化器代码块按照它们在类声明中出现的顺序组合在一起。这个单一的初始化过程会在第一次加载类时自动运行一次。

对于内部类,它们不能有静态字段

An inner class is a nested class that is not explicitly or implicitly declared static.

...

Inner classes may not declare static initializers (§8.7) or member interfaces...

Inner classes may not declare static members, unless they are constant variables...

见 JLS 8.1.3 Inner Classes and Enclosing Instances

Java 中的

final 字段可以独立于它们的声明位置进行初始化,但这不适用于 static final 字段。请参阅下面的示例。

final class Demo
{
private final int x;
private static final int z; //must be initialized here.

static
{
z = 10; //It can be initialized here.
}

public Demo(int x)
{
this.x=x; //This is possible.
//z=15; compiler-error - can not assign a value to a final variable z
}
}

这是因为只有一个 copy 与该类型关联的 static 变量,而不是与实例变量一样与该类型的每个实例相关联,如果我们尝试在构造函数中初始化 static final 类型的 z,它会尝试重新初始化 static final 类型字段 z,因为构造函数在类的每个实例上运行,静态 final 字段不能发生。

关于java - 静态变量什么时候初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8704423/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com