1.执行顺序:
静态构造块 (bean初始语句之前) → (bean初始语句之后)构造块 → 构造函数 → (bean初始化)
2.有继承的情况
父类静态构造快 → 子类静态构造块 → 父类构造块 → 父类构造函数 → 子类构造块 → 子类构造函数
3.必须要明白的
静态块:用static申明,JVM加载类时执行,仅执行一次(也就是某对象在第一次创建之后,第二次就不会执行),第一个静态块还没有执行好,后面的静态块都不会执行
构造块:类中直接用{}定义,每一次创建对象时执行
4.下面是一些演示,以及相关解释
package com;
public class Hen {
String master;
public String getMaster() {
return master;
}
public void setMaster(String master) {
this.master = master;
}
static {
System.out.println("hen静态构造块1");
System.out.println("<<<<<<<<内部start<<<<<<<<<");
Hen hen = new Hen("内部hen");
System.out.println("<<<<<<<<内部end<<<<<<<<<");
}
{
System.out.println("hen构造块1");
}
static {
System.out.println("hen静态构造块2");
}
{
System.out.println("hen构造块2");
}
public Hen() {
super();
}
public Hen(String master) {
super();
this.master = master;
System.out.println("hen构造函数");
}
}
package com;
public class Egg extends Hen {
String master;
public String getMaster() {
return master;
}
public void setMaster(String master) {
this.master = master;
}
static {
System.out.println("egg静态构造块");
}
{
System.out.println("egg构造块");
}
public Egg() {
super();
// TODO Auto-generated constructor stub
}
public Egg(String master) {
super();
this.master = master;
System.out.println("egg构造函数");
}
}
package com;
public class Main {
public static void main(String[] args) {
System.out.println("--------start------");
Hen hen1 = new Hen("hen1");
System.out.println("---------end-------");
System.out.println("--------start------");
Hen hen2 = new Hen("hen2");
System.out.println("---------end-------");
System.out.println("--------start------");
Egg egg1 = new Egg("egg1");
System.out.println("---------end-------");
System.out.println("--------start------");
Egg egg2 = new Egg("egg2");
System.out.println("---------end-------");
}
}
输出为:
--------start------
hen静态构造块1
<<<<<<<<内部start<<<<<<<<<
hen构造块1
hen构造块2
hen构造函数
<<<<<<<<内部end<<<<<<<<<
hen静态构造块2
hen构造块1
hen构造块2
hen构造函数
---------end-------
--------start------
hen构造块1
hen构造块2
hen构造函数
---------end-------
--------start------
egg静态构造块
hen构造块1
hen构造块2
egg构造块
egg构造函数
---------end-------
--------start------
hen构造块1
hen构造块2
egg构造块
egg构造函数
---------end-------
相关的解释:
遵照1,2,3,所述:
Hen hen1 = new Hen("hen1");
静态块仅执行一次,且最先执行,所以输出
hen静态构造块1
又hen静态快1中创建了内部的hen,第一个静态块还没有执行好,所以,后面的静态块都不会执行,所以根据上面的执行顺序,先构造块,后构造函数,输出为:
hen构造块1
hen构造块2
hen构造函数
然后继续执行Main方法的第一个新建,输出为:
hen静态构造块2
hen构造块1
hen构造块2
hen构造函数
因为static静态块只执行一次,所以第二次创建对象的时候,输出为:
hen构造块1
hen构造块2
hen构造函数
Egg继承了Hen,但是Hen的静态块已经执行过了,所以跟据上面的执行顺序,输出为:
egg静态构造块
hen构造块1
hen构造块2
egg构造块
egg构造函数
同理,再次创建时,输出为:
hen构造块1
hen构造块2
egg构造块
egg构造函数
5.参考文档:https://blog.csdn.net/qq_42128262/article/details/89191300