示例代码
class Father {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类普通代码块");
}
public Father(){
System.out.println("父类构造方法");
}
}
public class Son extends Father{
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类普通代码块");
}
public Son(){
System.out.println("子类构造方法");
}
public static void main(String[] args) {
Son son = new Son();
}
}
运行结果:
执行顺序:
- 父类静态代码块
- 子类静态代码块
- 父类代码块
- 父类构造方法
- 子类代码块
- 子类构造方法
原因:
- 被static修饰的属性和方法,无须创建对象,使用类名可直接调用
- static关键字修饰的内容在整个类执行之前会被优先加载 所有最先加载的是父类和子类的静态代码块
总结:
- 父类优先于子类
- 属性优先于代码块优先于构造方法
- 静态优先于非静态
因此,类加载顺序为:
父类静态变量->父类静态语句块->子类静态变量->子类静态语句块->父类普通成员变量->父类动态语句块->父类构造器->子类普通成员变量->子类动态语句块->子类构造器
评论区