【发布时间】:2021-03-24 03:51:06
【问题描述】:
A.我见过很多程序,每个全局变量都分配了默认值。 这个初始化工作是编译器还是JVM做的。
【问题讨论】:
标签: java static jvm instance compiler-optimization
A.我见过很多程序,每个全局变量都分配了默认值。 这个初始化工作是编译器还是JVM做的。
【问题讨论】:
标签: java static jvm instance compiler-optimization
我见过很多程序,每个全局变量都分配了默认值。这个初始化工作是编译器还是JVM做的。
严格来说,Java 没有“全局”变量。真正的全局变量随处可见,没有任何限制。 Java static 变量需要经过限定或导入才能使用。
class 变量的默认初始化由运行时系统执行。事实上,class 变量是默认初始化的first,即使它具有显式初始化。 (确实,在某些情况下,程序实际上可以在显式初始化之前看到默认初始化的值;请参阅 JLS 以获得解释。)
话虽如此,但说编译器初始化事物是绝对正确的。编译器生成一个包含代码和其他内容的.class 文件。但是需要初始化的变量不存在,直到编译后的代码开始执行之后。到那时,编译器就已经很好地完成了。
默认构造函数由编译器提供,当然它没有显式返回类型,它隐式返回任何内容。
没有 Java 构造函数有返回类型。并且没有 Java 构造函数显式返回任何内容。询问构造函数是否隐式返回一些东西并没有真正的意义。在字节码级别,序列是这样的:
new 字节码用于在堆中分配对象dup 字节码将对象引用的第二个副本推送到操作数堆栈中invokespecial 字节码用于调用相关的构造函数伪方法。这“消耗”了推送的引用(变为this)和参数。没有返回值被推送。【讨论】:
这个初始化工作是编译器还是JVM完成的。
取决于值。如果是所谓的编译时间常数,那就是编译器。否则虚拟机。例如,private static final long foo = System.currentTimeMillis(); 将由 VM 完成,因此最终将在 foo 中存储包含此行的类首次加载的时间点(这不会是系统启动,它将是第一次运行一些引用它的代码)。 private static final long foo = 5; 之类的东西是由编译器完成的,因为这是一个编译时常量。
默认构造函数由编译器提供,当然它没有显式返回类型,它隐式返回任何内容。
所有构造函数都不能有返回类型,这就是......为什么它们被称为构造函数。
在类文件级别,构造函数是一种特殊的方法,它返回您正在创建的实例,但在 java(语言)中您无法使用该信息进行任何操作。
【讨论】:
false。除了局部变量不是(它们需要在使用它们的值之前显式初始化)。 @NomadMaker