package polymorphic;
class Glyph {
void draw(){System.out.println("Glyph.draw()");}
public Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
String ff="i lovw";
void draw(){System.out.println("RoundGlyph.draw()"+radius);
System.out.println("ff"+ff);
}
private int radius=1;
public RoundGlyph(int r) {
radius=r;
System.out.println("RoundGlyph.RoundGlyph,raius="+radius);
}
}
public class PolyConstructor {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
/*output:
Glyph() before draw()
RoundGlyph.draw()0
Glyph() after draw()
RoundGlyph.RoundGlyph,raius=5
*/
//这个例子告诉我们初始化一个对象的步骤应该是这样的:
//1在调用父类构造器之前 对象的存储空间初始化为二进制的0
//2然后会调用基类的构造器,发现draw()方法被覆盖后,由于后期绑定的缘故,会调用子类对象本身draw()方法.
//此时方法中的radius变量还未进行初始化 所以显示为0
//3然后才会按照声明的顺序 初始化操作的成员
//4调用导出类的构造器主体
//所以我认为多态你需要注意的两个概念 第一个就是 动态绑定
//就是运行时根据对象的类型进行动态绑定 这是动态绑定的定义
//第二个需要注意的地方 就是这个构造器中有多态对象存在的案例
//所有子类对象还未进行初始化 但是 虚拟机会将对象的所有东西至少初始化为0
//为了避免这种情况发生 你可有在基类使用final或者private 避免多态出现