1 构造器内部调用重写方法
① 如果在构造器中调用动态绑定方法,就会用到该方法的重写定义。
② 如果构造器只是构造对象过程中的一个步骤,且构造的对象所属的类是从构造器所属的类派生出的,那么派生部分在当前构造器被调用时还没有初始化。
package com.hcong.polymorphism;
/**
* @Classname PolyConstructors
* @Date 2023/4/1 14:23
* @Created by HCong
*/
class Glyph {
void draw() {
System.out.println("Glyph.draw()");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw(); // 会调用子类重写的方法,此时子类的所有成员都未初始化(都为0 或 null)
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
@Override
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
那么,初始化顺序可总结如下:
① 在所有事发生前,分配给对象的存储空间会被初始化为二进制 0。
② 如前所述调用基类构造器。此时调用重写后的draw() 方法(是的,在调用RoundGraph 构造器之前调用),由步骤1 可知,radius 的值为0。
③ 按声明顺序初始化成员。
④ 最终调用派生类的构造器。