java代码块执行顺序

测试

代码如下:

public abstract class ADemo1 {

    static { System.out.println("static ADemo1 ~~~");
    }

    { System.out.println("ADemo1 ~~~"); }

    public ADemo1(){ System.out.println("ADemo1 无参构造"); }

    public ADemo1(String str){ System.out.println("ADemo1 有参构造"); }
}

public abstract class ADemo2 extends ADemo1{
    static { System.out.println("static ADemo2 ~~~"); }

    { System.out.println("ADemo2 ~~~"); }

    public ADemo2(){ System.out.println("ADemo2 无参构造"); }

    public ADemo2(String str){ System.out.println("ADemo2 有参构造"); }
}

public class ADemo3 extends ADemo2{
    static { System.out.println("static ADemo3 ~~~"); }

    { System.out.println("ADemo3 ~~~"); }

    public ADemo3(){ System.out.println("ADemo3 无参构造"); }

    public ADemo3(String str){ System.out.println("str" + " ADemo3有参构造"); }
}

public class Demo extends ADemo3{

    public Demo(String str){ System.out.println("str" + " Demo有参构造"); }

    static { System.out.println("static demo"); }

    public Demo(){ System.out.println("demo 无参构造"); }

    { System.out.println("Demo"); }

    public static void main(String[] args) {
        new Demo();
        System.out.println("==================
");
        new Demo("hello");
    }
}

类的继承层级如下:其中ADemo1和ADemo2为抽象类

java代码块执行顺序

测试输出结果:

java代码块执行顺序

修改Demo类的有参构造方法:

    public Demo(String str){ 
        super(str);
        System.out.println("str" + " Demo有参构造");
    }

测试输出结果:

java代码块执行顺序

结论

静态代码块只会调用一次

调用无参构造方法

java代码块执行顺序

调用有参构造方法

如果子类有参构造中没有调用父类有参构造:

java代码块执行顺序

如果子类有参构造中调用父类有参构造:

java代码块执行顺序