执行顺序大致分类:
- 静态属性,静态方法声明,静态块。
- 动态属性,普通方法声明,构造块。
- 构造方法。
详细介绍:
- 类中所有属性的默认值(一举而成)
- 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)
- 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)
- 调用父类的构造方法,
首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行) 然后父类构造方法 - 调用子类的构造方法,
首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行) 然后子类构造方法
1-3:类加载过程,不涉及构造方法
1-5:实例化过程,涉及构造方法
注意:
- 类属性(静态属性)只初始化一次,且是在类第一次被加载的时候。
- 类加载过程中,可能调用了实例化过程(因为static可以修饰方法,属性,代码块,内部类),此时则会暂停类加载过程而先执行实例化过程(被打断),执行结束再进行类加载过程,例如下面阿里面试题(典型的暂停类加载)。
正常的加载过程:
class A {
public A() {
System.out.println("A的构造方法");
}
public static int j = print();
public static int print() {
System.out.println("A print");
return 521;
}
}
public class Text extends A {
public Text() {
System.out.println("Test1的构造方法");
}
public static int k = print();
public static int print() {
System.out.println("Test print");
return 522;
}
public static void main(String[] args) {
System.out.println("main start");
Text t1 = new Text();
A.print();
}
}
运行结果:
A print
Test print
main start
A的构造方法
Test1的构造方法
A print
加载被打断(阿里面试题):
public class Text {
public static int k = 0;
public static Text t1 = new Text("t1");
public static Text t2 = new Text("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public Text(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String [] args) {
Text t = new Text("init");
}
}
运行结果:
1:j i=0 n=0
2:构造块 i=1 n=1
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
11:init i=10 n=102
网友评论