构造器内部的多态方法的行为
在基类的构造器中调用一个多态方法的话,由于此时导出类并没有完成初始化的动作,将会招致灾难(会在堆中为对象分配默认值为二进制为零的空间,即有这个变量,但是变量没有完成初始化)
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);}}
**
