jvm 初始化static 变量的类顺序


class Nolization{
static{
System.out.println("Nolization init");
}

public static int value = 123;
}

class Contant extends Nolization{

static{
System.out.println("Contant init");
}
}

public class ContantClass {
public static void main(String[] args) {
System.out.println(Contant.value);
}
}

上面这段代码的执行结果是 Nolization init
123
并没有输出 Contant init,这是因为 jvm 对于 静态字段,只有直接定义这个字段的类才会被初始化。

再看下面这段代码

class Nolization{
static{
System.out.println("Nolization init");
}

public static final int value = 123;
}

class Contant extends Nolization{

static{
System.out.println("Contant init");
}
}

public class ContantClass {
public static void main(String[] args) {
System.out.println(Contant.value);
}
}


相比于上段代码,仅仅是将value 从public static int 改为 public static final int ,输出的结果变成了 123,不再输出任何类的初始化信息。

这是因为 jvm 在编译阶段 将常量 123 存储到了 ContantClass 的常量池中,对 Contant.value 的引用实际都转化为 ContantClass 对自身常量的引用了,也就是说 ContantClass 的class文件中并不存在 Nolization 的任何调用入口,在编译成class文件之后,这两个字节码文件已经不存在任何联系了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

annan211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值