面试题:关于静态块、构造块、构造函数、普通代码块的优先级问题
- 静态块:的优先级最高,伴随类的加载而加载,且只会加载一次
- 构造块:即成员代码块(写在类体中的代码块),优先级次于静态块,高于构造函数,且每次创建新对象都会执行
- 构造函数:优先级次于静态块、构造块,每次创建新对象都会调用
- 普通快:最没地位,优先级最低
总结: 静态块 > 构造块 > 构造函数 > 普通快
看下面一段代码,了解在继承关系中,四者的优先级及调用顺序
父类
public class Father {
// 构造函数(父类)
public Father() {
System.out.println("Father constructor...");
fatherTest();
}
// 构造代码块(父类)
{
/**
* 构造块(成员代码块)
* 优先级别高于搞糟函数
* 每一次创建对象都会调用
*/
System.out.println("Father class block...");
}
public void fatherTest() {
// 普通代码块(父类)
{
/**
* 普通代码块
* 最没有地位,优先级最低
*/
System.out.println("Father function block...");
}
}
// 父类构造块
static {
/**
* 静态初始化块
* 优先级别最高,只在类加载时加载一次
*/
System.out.println("Father static block...");
}
}
子类
public class Son extends Father {
// 构造函数(子类)
public Son() {
System.out.println("Son constructor...");
sonTest();
}
// 构造代码块(子类)
{
System.out.println("Son class block...");
}
public void sonTest() {
// 普通代码块(子类)
{
System.out.println("Son function block...");
}
}
// 子类构造块
static {
System.out.println("Son static block...");
}
}
创建对象时
new Son();
结果
Father static block...
Son static block...
Father class block...
Father constructor...
Father function block...
Son class block...
Son constructor...
Son function block...