请问下面程序的运行结果

img


是不是先静态再普通最后构造,main函数里面那些对象有参和无参对程序运行结果有什么差别吗

执行结果是:
A
C
B
H
E
C
B
D
G
C
B
D
F
I

测试如下:

参考链接:


java 静态代码块只在类加载时执行一次_a337586131的博客-CSDN博客 java 类中的静态域的初始化和静态代码块的执行只在类加载的时候执行且只执行一次。仅执行一次,所以这一定是线程安全的,由此引出的在单例设计模式中采用静态内部类中的静态域存储唯一一个实例,既保证了线程安全又保证了懒加载,此技术被称作(initialization on demand holder)。但不在本文讨论范围。本文旨在验证静态代码块只执行一次,即线程安全。 我需要设计一个... https://blog.csdn.net/a337586131/article/details/84735173



class no1{
    
    // https://blog.csdn.net/Kern_/article/details/115673129
    // 1、创建a1对象,先执行静态初始化
    static {
        System.out.println("A");
    }
    
    // 3、创建a1对象,再调用无参的构造函数
    // 7、创建a2对象,因为未指明调用父类哪个构造器,所以就默认调用父类无参的构造器
    // 11、创建a3对象,调用父类无参的构造器
    no1(){
        System.out.println("B");
    }
    
    // 2、创建a1对象,接着执行非静态块
    // 6、创建a2对象,因为父类静态块只执行一次,所以就执行父类非静态代码块
    // 10、创建a3对象,执行父类非静态代码块
    {
        System.out.println("C");
    }
}

class no2 extends no1{
    
    // 8、创建a2对象,执行子类非静态代码块
    // 12、创建a3对象,调用子类非静态代码块
    {
        System.out.println("D");
    }
    
    // 5、创建a2对象,执行子类静态代码块
    static {
        System.out.println("E");
    }
    
    // 13、创建a3对象,调用子类无参的构造器
    no2(){
        System.out.println("F");
    }
    
    // 9、创建a2对象,调用子类有参的构造方法
    no2(int a){
        System.out.println("G");
    }
    

}

public class CallSequenceTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        no1 a1 = new no1();
        
        // 4、创建完a1对象,接着执行main方法这行代码
        System.out.println("H");
        
        no1 a2 = new no2(1);
        
        no2 a3 = new no2();
        
        // 14、创建完a3对象,调用main方法此行代码
        System.out.println("I");
        
    }

}

img

跑不出来吗