面试题:下面代码输出的结果
结果:
(5)(1)(10)(6) (9)(2)(3)(9)(7)(8) (9)(2)(3)(9)(7)(8)
分析:
类初始化过程
一个类要创建实例 应先初始化该类 main方法为所在的类需要先加载和初始化
类初始化需要先初始化父类
类初始化就是执行<clinit>()方法
<clinit>()方法由 静态类变量显示赋值代码(如图中 static int i=method() )和静态代码块组成
静态类变量赋值代码和静态代码块从上到下顺序执行
<clinit>()方法只执行一次
所以如果main方法中为空的话也会默认初始化son类 即只进行类初始化
public static void main(String[] args) {
}
则此时结果是 (5)(1) (10)(6)
实例初始化过程
实例初始化就是执行<init>()方法
<init>() 方法可能重载有多个 有几个构造器就有几个<init>方法
<init>()方法由非静态实例变量显示赋值代码和非静态代码块 ,对应构造器组成
非静态实例变量显示赋值代码和非静态代码块从上到下顺序执行 ,构造器的代码最后执行
每次创建实例对象 调用对应构造器 执行的就是对应的<init>方法
<init>方法的首行是super()或super(实参列表) 及对应父类的init() 方法
所以 子类实例初始化的时候 super()先执行 则父类调用 test()方法时 非静态方法前面有一个默认对象this this在构造器 或<init>表示正在创建的对象 因为这里是在创建son对象 所以test()执行的是子类重写的代码(面向对象多态 编译看左边 运行看右边)输出(9)
子类无参构造最后执行
public static void main(String[] args) {
Son s1 = new Son();
Son s2 = new Son();
}
子类的初始化<clinit>
1. 子类静态成员变量(写在静态代码块前,先执行)
2. 子类静态代码块(写在静态成员变量后,后执行)
先初始化父类:==> (5)(1)
初始化子类:==> (10)(6)
子类的实例初始化<init>:
1. super() ==> (9)(2)(3)
2. 子类的非静态成员变量(写在非静态代码块前,先执行)==> (9)
3. 子类的非静态代码块(写在非静态成员变量后,后执行)==> (7)
4. 子类的无参构造==> (8)