关于静态代码块和非静态代码块执行顺序(了解这些你就了解所有)

public class Father {
public static final Father ff = new Father();
static{
System.out.println("父类静态代码执行了");
}
{
System.out.println("父类非静态代码执行了");
}
Father(){
System.out.println("父类构造方法");
}

}

public class Son extends Father {
static{
System.out.println("子类静态代码执行了");
}
{
System.out.println("子类非静态代码执行了");
}
Son(){
System.out.println("子类构造方法执行了");
}
public static void main(String[] args) {
System.out.println("子类main方法执行了");
new Son();
}

}

分析思路(核心静态代码块是随着类的加载而加载,而且只执行一次,非静态代码块优先于构造代码块,执行是随着对象的创建而执行的)

son这个类继承了father类,在加载son这个类的时候会先加载father这个类,执行的顺序是从上到下,所有先执行father类中创建对象,创建对象会先执行father类非静态代码块,然后在执行father构造方法,之后执行father类静态代码块(随着类的加载而加载,而且只加载一次),

然后回到son类,先执行son类的静态代码,在执行main方法的输出,之后new了一个son对象,因为有继承关系,所以先执行father类非静态方法,在执行father类构造方法,然后执行son类非静态方法,在执行son类构造方法

最终执行顺序如下:

父类非静态代码执行了
父类构造方法
父类静态代码执行了
子类静态代码执行了
子类main方法执行了
父类非静态代码执行了
父类构造方法
子类非静态代码执行了
子类构造方法执行了

猜你喜欢

转载自www.cnblogs.com/BaiChunLong/p/11331714.html