以上运行结果 (5) (1) (10) (6) (9) (3) (2) (9) (8)(7)
(9) (3) (2) (9) (8)(7)
- 解析 考点
- 类初始化过程
- 一个类要创建实例 应先初始化该类 main方法为所在的类需要先加载和初始化
- 类初始化需要先初始化父类
- 类初始化就是执行<clinit>()方法
- <clinit>()方法由 静态类变量显示赋值代码(如图中 private static int j=method() )和静态代码块组成
- 静态类变量赋值代码和静态代码块从上到下顺序执行
- <clinit>()方法只执行一次
所以如果main方法中为空的话也会默认初始化son类 即只进行类初始化
则此时结果是 (5)(1) (10)(6)
- 实例初始化过程
- 实例初始化就是执行<init>()方法
- <init>() 方法可能重载有多个 有几个构造器就有几个<init>方法
- <init>()方法由非静态实例变量显示赋值代码和非静态代码块 ,对应构造器组成
- 非静态实例变量显示赋值代码和非静态代码块从上到下顺序执行 ,构造器的代码最后执行
- 每次创建实例对象 调用对应构造器 执行的就是对应的<init>方法
- <init>方法的首行是super()或super(实参列表) 及对应父类的init() 方法
- 所以 子类实例初始化的时候 super()先执行 则父类调用 test()方法时 非静态方法前面有一个默认对象this this在构造器 或<init>表示正在创建的对象 因为这里是在创建son对象 所以test()执行的是子类重写的代码(面向对象多态 编译看左边 运行看右边)输出(9)
子类无参构造最后执行
扩展 父类那些方法不可以被重写
final 方法
静态方法
private等子类中不可见的方法
对象的多态性
子类如果重写了父类中的方法 通过子类对象调用的一定是子类重写的方法
非静态方法默认的调用对象是this
this对象在构造器或者说<init>方法中就是正在创建的对象