类加载过程
- 加载:把class文件加载进内存
- 验证:class文件的有效性,安全性,是否符合jvm的规则
- 准备:为类属性分配内存并设置初始值,
- 解析:把常量池中的符号引用替换成地址引用
- 初始化:class对象的初始化,执行静态代码块和静态属性的赋值
对象初始化过程
父类代码
package com.example.demo;
public class Parent {
static {
s = "111";
System.out.println("init parent static code");
}
protected static String s = asd();
static {
s = "222";
System.out.println("init parent static code 1");
}
public Parent(){
System.out.println("init Parent 构造器");
}
public static String asd() {
System.out.println("init parent static Field");
return "333";
}
}
子类代码
package com.example.demo;
public class Child extends Parent{
static {
s1 = "111";
System.out.println("init child static code");
}
static {
s1 = "222";
System.out.println("init child static code 1");
}
protected static String s1 = initField();
public static String initField() {
System.out.println("init child static Field");
return "333";
}
public Child() {
System.out.println("init child 构造器");
}
public static void main(String[] args) {
new Child();
System.out.println(child.s);
System.out.println(child.s1);
}
}
结果:控制台打印
init parent static code
init parent static Field
init parent static code 1
init child static code
init child static code 1
init child static Field
init Parent 构造器
init child 构造器
222
333
对象的初始化顺序:
1、父类静态属性赋值、代码块 按照书写顺序执行(静态属性会在初始化之前分配好内存地址)。
2、子类静态属性赋值、代码块 按照书写顺序执行
3、父类构造器
4、子类构造器