子类实体化的过程有以下几个步骤:
1.先执行父辈类的静态资源(static 修饰的代码块和属性赋值)在执行子类的静态资源。
2.后执行父类的属性赋值同时执行非静态代码块,然后在执行构造方法
3.最后执行子类的属性赋值同时执行非静态代码块,最后再来执行子类的构造方法
总结如下:
先后顺序:父类的静态资源(包括静态代码和静态属性赋值)-->子类的的静态资源(包括静态代码和静态属性赋值)-->父类的非静态属性赋值和非静态代码块-->父类的构造方法-->子类的非静态属性赋值和非静态代码块-->子类的构造方法
1.父类优先于子类
2.静态优先于非静态
3.属性赋值和代码块同时进行且优先于构造方法
4.优先级相同时,从上往下执行
5.静态资源全局只执行一次
示例:
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
}
class Tableware {
static Bowl bowl7 = new Bowl(7);
static {
System.out.println("Tableware静态代码块");
}
Tableware() {
System.out.println("Tableware构造方法");
}
Bowl bowl6 = new Bowl(6);
}
class Table extends Tableware {
{
System.out.println("Table非静态代码块_1");
}
Bowl bowl5 = new Bowl(5); // 9
{
System.out.println("Table非静态代码块_2");
}
static Bowl bowl1 = new Bowl(1);
static {
System.out.println("Table静态代码块");
}
Table() {
System.out.println("Table构造方法");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard extends Tableware {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard构造方法");
}
void otherMethod(int marker) {
System.out.println("otherMethod(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String args[]) {
System.out.println("main()");
cupboard.otherMethod(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
idea运行结果图如下:
详解如下:
执行该语句 static Table table = new Table();对子类Table进行实例化
1.由于要先执行他父类中的静态资源,所以先执行Tableware中的static Bowl bowl7 = new Bowl(7);对静态属性进行赋值,然后输出–> Bowl(7)
2.优先级相同时,从上往下执行。所以执行父类Tableware中的静态代码块 static {
System.out.println("Tableware静态代码块");
}输出-->Tableware静态代码块
3.父类Tableware中的静态资源执行完之后,执行子类Table中的静态资源,从上往下执行,所以执行static Bowl bowl1 = new Bowl(1);,然后输出-->Bowl(1)
4.再执行子类Table中的 静态代码块static {
System.out.println("Table静态代码块");
}然后输出-->Table静态代码块
5.然后执行子类的static Bowl bowl2 = new Bowl(2);输出--> Bowl(2)
6.子类中的静态资源执行结束后,执行父类Tableware中的非静态代码块和非静态属性赋值,同样从上往下,所以执行非静态属性赋值Bowl bowl6 = new Bowl(6);输出-->Bowl(6)
7.执行完父类Tableware中的非静态代码块和非静态属性赋值后,执行父类的构造方法Tableware() {
System.out.println("Tableware构造方法");
}输出-->Tableware构造方法
8.父类Tableware中的非静态代码块和非静态属性赋值执行完后,执行子类中的非静态代码块和非静态属性赋值, {
System.out.println("Table非静态代码块_1");
}输出-->Table非静态代码块_1
9.然后从上往下执行 ,执行非静态属性赋值Bowl bowl5 = new Bowl(5);输出--> Bowl(5)
10.从上往下执行,所以执行 {
System.out.println("Table非静态代码块_2");
}非静态代码块,输出-->Table非静态代码块_2
11.执行完子类中的非静态代码块和非静态属性赋值之后,执行子类的构造方法 Table() {
System.out.println("Table构造方法");
}输出-->Table构造方法
//到此子类Table的实例化过程完成。开始执行 static Cupboard cupboard = new Cupboard();子类CupBoard的实例化过程,由于是同一个父类,且父类中的静态资源,全局只执行一次,依此类推:
12.执行子类Cupboard的静态资源static Bowl bowl4 = new Bowl(4);输出-->Bowl(4)
13同样的从小往下,然后执行static Bowl bowl5 = new Bowl(5);输出-->Bowl(5)
14.执行完子类中的静态资源,然后开始执行父类的非静态代码块和非静态属性赋值 Bowl bowl6 = new Bowl(6);输出-->Bowl(6)
15.父类的非静态代码块和非静态属性赋值执行完后,开始执行父类的构造方法Tableware() {
System.out.println("Tableware构造方法");
}输出-->Tableware构造方法
16父类的构造方法执行完后,执行子类的非静态代码块和非静态属性赋值Bowl bowl3 = new Bowl(3);输出-->Bowl(3)
17子类的非静态代码块和非静态属性赋值执行完后,执行子类的构造方法 Cupboard() {
System.out.println("Cupboard构造方法");
}输出-->Cupboard构造方法
//到此为止,子类Cupboard的实例化过程结束,main方法中的静态资源执行完毕,开始执行非静态资源
18.执行main方法中的非静态资源System.out.println("main()");输出main()
19.然后往下执行cupboard.otherMethod(1);调用此方法 void otherMethod(int marker) {
System.out.println("otherMethod(" + marker + ")");
}其中marker的值为1,所以输出-->otherMethod(1)
//到此程序执行结束。