构造器内部的多态方法的行为
在基类的构造器中调用一个多态方法的话,由于此时导出类并没有完成初始化的动作,将会招致灾难(会在堆中为对象分配默认值为二进制为零的空间,即有这个变量,但是变量没有完成初始化)
class Glyph{
void draw(){System.out.println("Glyph.draw()");}
Glyph(){
System.out.println("Before invoke Glyph.draw()");
draw();//此时调用的是父类的方法 还是 子类的方法
System.out.println("After invoke Glyph.draw()");
}
}
class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
System.out.println("RoundGlyph.RoundGlyph.radius = "+radius);
}
void draw() {
System.out.println("RoundGlyph.draw() = "+radius);
}
}
public class PolytConstructor {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
如果说仅仅要去调用基类中的方法的话,建议将该方法定义为private final类型的(final可省略),避免其他类去覆盖该方法。
初始化顺序总结
1,在其他任何事物发生之前,将会给对象分配二进制初始化为0的空间
2,初始化顺序参考以下代码
2-1,如果有静态域、静态代码块,按照声明顺序执行初始化
2-2,如果有普通域、普通代码块,按照声明顺序执行初始化
2-2,最后执行构造器中的代码,按声明顺序【构造器是确保初始化的最后屏障】
class Foo{
Foo(String flag){
System.out.println("Foo("+flag+") constructor");
}
}
class Glyph{
private Foo foo = new Foo("no static varibale");
private static Foo sfoo = new Foo("static variable");
{
System.out.println("普通代码块");
}
static {
System.out.println("静态代码块");
}
private void draw(){System.out.println("Glyph.draw()");}
//构造器是最后确保初始化的屏障
Glyph(){
System.out.println("Before invoke Glyph.draw()");
draw();//此时调用的是父类的方法 还是 子类的方法
System.out.println("After invoke Glyph.draw()");
}
}
class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
System.out.println("RoundGlyph.RoundGlyph.radius = "+radius);
}
void draw() {
System.out.println("RoundGlyph.draw() = "+radius);
}
}
public class PolytConstructor {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
**