class A { //1.静态初始化块A static { System.out.println("静态初始块 A"); } //3.构造代码块 A1 { System.out.println("构造代码块 A1"); } //5.构造器 A A() { System.out.println("构造器 A"); } //4.构造代码块 A2 { System.out.println("构造代码块 A2"); }}/** * 创建B的对象实例时会优先执行父类的构造方法 */class B extends A { //2.静态初始化块 static { System.out.println("静态初始块 B"); } //6.构造代码块 B1 { System.out.println("构造代码块 B1"); } //8.无参构造器 B B() { System.out.println("无参构造器 B"); } //8.有参构造器 B B(String a) { System.out.println("有参构造器 B 参数为:"+a); } //7.构造代码块 B2 { System.out.println("构造代码块 B2"); }}class C extends B{//3.继承的构造器执行 //4.非静态数据初始化 优先于构造器的和构造代码块的执行 B b=new B("非静态数据初始化C"); //1.静态数据初始化 优先于静态初始化块、非静态数据的初始化、构造代码块、构造器的执行 static B b1=new B("静态数据初始化C"); //2.静态初始化块 优先于非静态数据的初始化、构造代码块、构造器的执行 static { System.out.println("静态初始块 C"); } //5.构造代码块1 优先于构造代码块2 构造器的执行 { System.out.println("构造代码块 C1"); } //7.构造器的执行 C(){ System.out.println("无参构造器 C"); b = new B("构造器C中调用构造方法"); } //6.构造代码块2 优先于构造器的执行 { System.out.println("构造代码块 C2"); }}public class Main { static { System.out.println("静态初始块 Main");//在mian方法调用之前执行 } { System.out.println("构造代码块 Main");//由于main方法没有创建Mian实例,所以此处不会执行 } public Main() { System.out.println("无参构造器 Main");//由于main方法没有创建Mian实例,所以此处不会执行 } public static void main(String[] args) { C c = new C();//创建类C的对象实例 }}
运行结果:
静态初始块 Main静态初始块 A静态初始块 B构造代码块 A1构造代码块 A2构造器 A构造代码块 B1构造代码块 B2有参构造器 B 参数为:静态数据初始化C静态初始块 C构造代码块 A1构造代码块 A2构造器 A构造代码块 B1构造代码块 B2无参构造器 B构造代码块 A1构造代码块 A2构造器 A构造代码块 B1构造代码块 B2有参构造器 B 参数为:非静态数据初始化C构造代码块 C1构造代码块 C2无参构造器 C构造代码块 A1构造代码块 A2构造器 A构造代码块 B1构造代码块 B2有参构造器 B 参数为:构造器C中调用构造方法