当前位置: 首页 > 面试题库 >

Java 静态变量何时初始化?

莫英喆
2023-03-14
问题内容

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

另外,如果你可以参考“ 为什么没有及时初始化静态字段?”这一问题进行解释,尤其是Kevin Brock在同一网站上给出的答案。我不明白第三点。


问题答案:

从请参阅Java静态变量方法:

  • 它是一个属于类而不属于对象(实例)的变量
  • 静态变量在执行开始时仅初始化一次。在初始化任何实例变量之前,将首先初始化这些变量
  • 该类的所有实例共享一个副本
  • 静态变量可以通过类名直接访问,不需要任何对象。

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

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

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

一个内部类是没有明确或隐含声明的嵌套类static

内部类不能声明静态初始化器(第8.7节)或成员接口。

内部类不能声明静态成员,除非它们是常量变量。

请参见JLS 8.1.3内部类和封闭实例

finalJava中的字段可以与声明位置分开进行初始化,但这不适用于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
    }
}

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



 类似资料:
  • 问题内容: 如何在Java中初始化类的私有静态成员。 尝试以下操作: 但是在创建类A的第二个对象然后调用f1()时,我得到了空指针异常。 问题答案: 初始化静态成员的首选方法是(如上所述) 或者对于更复杂的初始化代码,您可以使用静态初始化程序块:

  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清

  • 问题内容: 我有以下代码: 这给了我以下错误: 解析错误:语法错误,在第19行的/home/user/Sites/site/registration/inc/registration.class.inc中出现意外的’(’,期待’)’ 所以,我想我做错了什么…但是如果不那样做怎么办?如果我用常规字符串更改mktime内容,它将起作用。所以,我知道我能做到这一点 的那种 像.. 有人有指针吗? 问题答

  • 问题内容: 我想知道静态变量(在类中)何时出现在图片中(初始化)?是在实例构造函数首次调用之后还是在类加载之后?什么时候加载类? 问题答案: 哦,那很复杂。这取决于是否设置了标志,而标志(在C#中)又取决于是否有静态构造函数。更糟的是;在.NET 4中, 我相信 行为发生了变化,使其比以前更加“懒惰”。 坦白说,我不会在此处编写任何特定行为的代码。简单:只要您使用常规代码访问静态字段,它们就会在尝

  • 问题内容: 当我运行此代码时,答案是1,我想应该是2。初始化的顺序和每一步中k的值是什么? 编辑1:作为后续的“ k设置为默认值”,那么为什么下一个代码不能编译?出现错误“在定义字段之前无法引用它”。 编辑2:出于某种我不知道的原因,它^可以在其“ Test.k”代替“ k”时使用。 感谢所有的答案。这将满足:D 问题答案: 它们按照您编写它们的顺序执行。如果代码是: 然后输出变为2。 初始化的顺

  • 我正在经历对我来说毫无意义的奇怪行为。以下程序(我试图将其简化为最小的示例)因而崩溃,因为为: 我希望它打印: 但是如果(可以通过取消对main方法的第一行的注释或对以下两行重新排序来完成),程序将正确终止。 我怀疑这个问题与Java类初始化顺序有关,但我在相关JLS部分中找不到任何解释。 所以,我的问题是:这到底是怎么回事?这是某种虫子还是我错过了什么? 我的JDK版本是1.8.0_111