关于Java中类加载时对其属性和代码块初始化顺序的研究与测试

本文通过测试代码展示了Java中类加载、链接和初始化的过程,特别是静态变量与静态代码块的初始化顺序。测试结果揭示了类及其成员初始化的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  关于类加载时对其内部属性,代码块初始化(通常是分配栈内存)的顺序的测试结果如下几点:
 * 1,类的加载,这是由类加载器执行的,该步骤将查找字节码(通常是在classPath的类路径下)但这种并非是必须的,并从这些字节码中创建Class对象。
 * 2,链接,在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必须的话。将解析这个类创建的对其他类的所有引用。所有的带有static关键字的成员变量和静态代码块的存储空间就是在这个时候分配的(其中他们的分配空间的顺序是按照代码的先后顺序的)。
 * 3,初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块(对成员变量和静态初始化块初始化)。
 * 首先明确一点,就是不管类的构造器是否对其成员变量进行手动赋值,类在加载的时候都会为其成员变量
 * 初始化的,并且它的初始化时机要比构造器初始化早的多(构造器初始化是发生在new对象的时候),
 * 对成员变量和静态初始化块初始化得顺序按照当前的代码先后顺序。

以下为测试代码:

测试结果:

   

输出结果:

 

9
Bowl(1);
9
Bowl(2);
Table();
f1(1);
9
Bowl(4);
9
Bowl(5);
9
Bowl(3);
Cupboard();
f1(2);
Creating new Cupboard() in main
9
Bowl(3);
Cupboard();
f1(2);
Creating new Cupboard() in main
9
Bowl(3);
Cupboard();
f1(2);
f2(1);
f3(1);

具体Java虚拟机是怎么管理内存的,和它对堆和栈是如何处理的,还需请教高手指点!

                             -----------------------此文章仅为本人Java的复习总结

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值