类的加载过程:
1.JVM会先去方法区中找有没有相对应类的.class存在。如果有就直接使用,如果没有,则把相关类的.class 加载到方法区
2.在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容
3.加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内
4.加载静态内容:
4.1: 把.class的所有静态内容加载到方法区下的静态区域内
4.2: 静态内容加载完成后,对所有的静态变量进行默认初始化
4.3: 静态变量默认初始化完成之后,对其进行显示初始化
4.4: 当静态区域下的所有静态变量显示初始化完成之后,执行静态代码块
5. 当静态区域的静态代码块执行完之后,整个类就加载完了
6. 如果存在继承关系,那么父类先加载,再加载子类
在加载静态的过程中,先要加载静态的成员变量,然后再加载静态代码块,之后再加载静态的成员方法。
实例的初始化过程: new 对象
1. 在堆中开辟一块空间 这块空间会分割成两份 一份是super 一份是this
2. 给开辟的空间分配一个地址
3. 把对象的所有非静态成员加载到所开辟的空间中
4. 所有的非静态成员加载完毕后,对所有的非静态成员变量进行默认初始化
5. 所有的非静态成员变量默认初始化之后,调用构造函数
6 构造方法进入栈内存执行,分为两部分:先执行构造方法的隐式三步,再执行构造方法中书写的代码
隐式三步:
1. 执行super()语句 所有的类都是object的子类,每个方法中都有默认的super() 如果定义了有参构造,那么原来的就会被覆盖掉
2. 对开辟空间下的所有非静态成员变量进行赋值(显示初始化)
3. 执行构造代码块 { }
7. 隐式三步执行后,执行构造函数中的代码
8.再整个构造函数执行完并弹栈后,把空间分配的地址赋值给一个引用对象(最后才把地址值赋值给栈中使用)
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
附件列表