类加载

面试 请问下面代码的输出是怎样的?

// Dad.java
public class Dad {
   static {
       System.out.println("父类--静态代码块---------- 1");
   }
   private static Dad dad = new Dad();
   static {
       System.out.println("父类--静态代码块---------- 2");
   }
   public Dad() {
       System.out.println("父类--构造函数");
   }
   {
       System.out.println("父类--非静态代码块");
   }
   public static void main(String[] args) {
       System.out.println("main---------------- 1");
       new Son();
       System.out.println("main---------------- 2");
       new Son();
   }
}

class Son extends Dad {
   static {
       System.out.println("子类--静态代码块------------ 1");
   }
   private static Son son = new Son();
   static {
       System.out.println("子类--静态代码块------------ 2");
   }
   {
       System.out.println("子类--非静态代码块");
   }
   public Son() {
       //super(); //默认调用
       System.out.println("子类--构造函数");
   }
}

思考一下
3
2
1

父类--静态代码块---------- 1
父类--非静态代码块
父类--构造函数
父类--静态代码块---------- 2
main---------------- 1
子类--静态代码块------------ 1
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块------------ 2
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
main---------------- 2
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数

属性、方法、构造方法和自由块都是类中的成员,在创建对象时,各成员的执行顺序如下。
1) 父类 静态成员 和 静态初始化块, 按在代码中 出现的顺序 依次执行。
2) 子类 静态成员 和 静态初始化块, 按在代码中 出现的顺序 依次执行。
3) 父类 实例成员 和 实例初始化块, 按在代码中 出现的顺序 依次执行。
4) 执行父类 构造方法。
5) 子类 实例成员 和 实例初始化块, 按在代码中 出现的顺序 依次执行。
6) 执行子类 构造方法。

continue...

你可能感兴趣的:(类加载)