运行结果
一、初始main方法所在的类,有父类先初始化父类,初始属性和构造方法,执行顺序与代码顺序一致
(5)(1)(10)(6)
二、对象Son初始化
1、调用super
* 加载父类f非静态的对象,属性与代码块按顺序,构造器最后执行,顺序如下
① i =test(); //实际执行子类重写的对象 (9)
② 调用父类非静态代码块 (3)
③ 加载父类构造方法 (2)
2 加载子类非静态对象
* 加载子类非静态属性,构造器,这两项按顺序加载 (9)(8)
* 最后加载子类构造方法 (7)
1.1一个类要创建实例需要先加载并初始化这个类
- main方法所在的类需要先加载和初始化
1.2一个子类要初始化就必须先初始化它的父类
1.3一个类初始化的过程就是执行<client>
()方法的过程
<client>
()由静态变量线索赋值和静态代码块组成,而且这两种的执行顺序由它们所在代码中的先后位置决定,
2 类初始化完毕就要开始实例初始化了,实例化就是执行<init>()
的步骤
<init>()
的方法可能重载多个,有几个构造方法就有相当于重载多少次,每次创建实例对象执行构造器就相当于执行<init>()
<init>()
的方法由非静态的代码块和属性(执行顺序就是它们在代码中出现的顺序)以及构造方法组成- 执行顺序总结:
1 执行子类构造函数中的super(),也就像先构造父类的对象;
2子类的属性赋值和非静态代码块的执行顺序与他们在代码中的出现顺序一致;
3 最后执行子类的构造函数
3 还要考虑子类的重写和面向对象的多态
- fianl方法,静态方法,父类声明为private的方法不能出现重写
- 出现重写时,子类如果重写了父类的方法,那么通过子类的对象(经常以this的形式出现)调用的必然是子类的方法
- this在构造器中就是当前正在创建对象的意思