【问题标题】:Global variables static and non-static are initialized with default values are assigned by compiler or something else? [closed]全局变量静态和非静态初始化为默认值由编译器或其他东西分配? [关闭]
【发布时间】:2021-03-24 03:51:06
【问题描述】:

A.我见过很多程序,每个全局变量都分配了默认值。 这个初始化工作是编译器还是JVM做的。

【问题讨论】:

    标签: java static jvm instance compiler-optimization


    【解决方案1】:

    我见过很多程序,每个全局变量都分配了默认值。这个初始化工作是编译器还是JVM做的。

    严格来说,Java 没有“全局”变量。真正的全局变量随处可见,没有任何限制。 Java static 变量需要经过限定或导入才能使用。

    class 变量的默认初始化由运行时系统执行。事实上,class 变量是默认初始化的first,即使它具有显式初始化。 (确实,在某些情况下,程序实际上可以在显式初始化之前看到默认初始化的值;请参阅 JLS 以获得解释。)

    话虽如此,但说编译器初始化事物是绝对正确的。编译器生成一个包含代码和其他内容的.class 文件。但是需要初始化的变量不存在,直到编译后的代码开始执行之后。到那时,编译器就已经很好地完成了。

    默认构造函数由编译器提供,当然它没有显式返回类型,它隐式返回任何内容。

    没有 Java 构造函数有返回类型。并且没有 Java 构造函数显式返回任何内容。询问构造函数是否隐式返回一些东西并没有真正的意义。在字节码级别,序列是这样的:

    • new 字节码用于在堆中分配对象
    • dup 字节码将对象引用的第二个副本推送到操作数堆栈中
    • 执行字节码代码以评估构造函数参数并将它们推送到操作数堆栈中
    • invokespecial 字节码用于调用相关的构造函数伪方法。这“消耗”了推送的引用(变为this)和参数。没有返回值被推送。
    • 返回调用代码时,操作栈上的原始引用会被分配或返回。

    【讨论】:

      【解决方案2】:

      这个初始化工作是编译器还是JVM完成的。

      取决于值。如果是所谓的编译时间常数,那就是编译器。否则虚拟机。例如,private static final long foo = System.currentTimeMillis(); 将由 VM 完成,因此最终将在 foo 中存储包含此行的类首次加载的时间点(这不会是系统启动,它将是第一次运行一些引用它的代码)。 private static final long foo = 5; 之类的东西是由编译器完成的,因为这是一个编译时常量。

      默认构造函数由编译器提供,当然它没有显式返回类型,它隐式返回任何内容。

      所有构造函数都不能有返回类型,这就是......为什么它们被称为构造函数。

      在类文件级别,构造函数是一种特殊的方法,它返回您正在创建的实例,但在 java(语言)中您无法使用该信息进行任何操作。

      【讨论】:

      • 没有特定值的变量被初始化为 0 或 null。
      • – 或false。除了局部变量不是(它们需要在使用它们的值之前显式初始化)。 @NomadMaker
      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多