1.检查static关键字
如果有static关键字修饰,即该对象为一个静态对象,那么其会被优先加载到虚拟机中执行;
2.找到class
找到class后,会创建一个Class对象,其所有static模块都会执行,但是只在对象载入时执行一次
3.分配内存
此时,new关键字所修饰的类进程会在内存堆(Heap)中,为该类分配足够的内存空间
4.初始化
这时,被分配的内存空间会被清零,并将不同的变量类型初始化为默认值(一般为0)
5.执行构造器
最后执行构造器。
1 | //StaticInitialization.java |
这里解释一下:为什么主函数之外的代码先执行了?
Java编译时会从main()所在的类开始编译,然后main()外的对象实例化都是静态的,所以,其会被优先加载到虚拟机中执行,执行完毕后,在进入主函数。
如果主函数变成这样呢:
1 | public class StaticInitialization { |
此时,main()函数外没有静态变量,所以直接进入主函数;
- 输出:Creating new Cupboard in main
- 实例化一个Cupboard()对象:
- 寻找名为Cupboard的class
- 先执行其中的static
- 再执行构造器