全局变量静态和非静态初始化,默认值由编译器或其他什么东西赋值?

wz1wpwve  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(358)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

27天前关门了。
改进这个问题
a、 我看过很多程序,每个全局变量都有默认值。这是由编译器或jvm完成的初始化工作。

p5cysglq

p5cysglq1#

这是由编译器或jvm完成的初始化工作。
取决于值。如果它是一个所谓的编译时常量,那么编译器。否则vm。例如, private static final long foo = System.currentTimeMillis(); 将由vm完成,因此最终将存储在 foo 包含此行的类第一次加载的时间点(这不是系统启动,而是一些引用它的代码第一次运行)。像这样的 private static final long foo = 5; 由编译器完成,因为这是编译时常量。
默认构造函数是由编译器提供的,当然它没有显式的返回类型,而是隐式地返回任何内容。
所有构造函数都不能有返回类型,这是。。。为什么他们被称为构造器。
在类文件级别,构造函数是一种特殊的方法,它返回您正在创建的示例,但在java(语言)中,您无法处理这些信息。

slsn1g29

slsn1g292#

我看过很多程序,每个全局变量都有默认值。这是由编译器或jvm完成的初始化工作。
严格地说,java没有“全局”变量。真正的全局变量随处可见,没有任何限制。java static 变量需要经过限定或导入才能使用。
的默认初始化 class 变量由运行时系统执行。事实上,一个 class 即使变量有显式初始化,也会首先初始化它(实际上,在某些情况下,在显式初始化之前,程序实际上有可能看到默认的初始化值;有关说明,请参阅jls。)
话虽如此,说编译器初始化东西绝对不可能是完全正确的。编译器生成 .class 包含代码和其他内容的文件。但是需要初始化的变量在编译代码开始执行之前不存在。到那时,编译器已经完全完成了。
默认构造函数是由编译器提供的,当然它没有显式的返回类型,而是隐式地返回任何内容。
没有java构造函数具有返回类型。而且没有java构造函数显式返回任何内容。如果询问构造函数是否隐式返回了某些内容,这并不是真正有意义的。在字节码级别,序列如下所示:
这个 new 字节码用于在堆中分配对象
dup 字节码将对象引用的第二个副本推送到操作数堆栈上
执行字节码来计算构造函数参数并将它们推送到操作数堆栈上
invokespecial 字节码用于调用相关的构造函数伪方法。这“消耗”了推送的引用(成为 this )还有争论。不推送返回值。
返回到调用代码时,opstack上的原始引用将被分配或返回。

相关问题