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

    1. class Glyph{
    2. void draw(){System.out.println("Glyph.draw()");}
    3. Glyph(){
    4. System.out.println("Before invoke Glyph.draw()");
    5. draw();//此时调用的是父类的方法 还是 子类的方法
    6. System.out.println("After invoke Glyph.draw()");
    7. }
    8. }
    9. class RoundGlyph extends Glyph{
    10. private int radius = 1;
    11. RoundGlyph(int r){
    12. radius = r;
    13. System.out.println("RoundGlyph.RoundGlyph.radius = "+radius);
    14. }
    15. void draw() {
    16. System.out.println("RoundGlyph.draw() = "+radius);
    17. }
    18. }
    19. public class PolytConstructor {
    20. public static void main(String[] args) {
    21. new RoundGlyph(5);
    22. }
    23. }

    如果说仅仅要去调用基类中的方法的话,建议将该方法定义为private final类型的(final可省略),避免其他类去覆盖该方法。

    初始化顺序总结
    1,在其他任何事物发生之前,将会给对象分配二进制初始化为0的空间
    2,初始化顺序参考以下代码
    2-1,如果有静态域、静态代码块,按照声明顺序执行初始化
    2-2,如果有普通域、普通代码块,按照声明顺序执行初始化
    2-2,最后执行构造器中的代码,按声明顺序【构造器是确保初始化的最后屏障】

    1. class Foo{
    2. Foo(String flag){
    3. System.out.println("Foo("+flag+") constructor");
    4. }
    5. }
    6. class Glyph{
    7. private Foo foo = new Foo("no static varibale");
    8. private static Foo sfoo = new Foo("static variable");
    9. {
    10. System.out.println("普通代码块");
    11. }
    12. static {
    13. System.out.println("静态代码块");
    14. }
    15. private void draw(){System.out.println("Glyph.draw()");}
    16. //构造器是最后确保初始化的屏障
    17. Glyph(){
    18. System.out.println("Before invoke Glyph.draw()");
    19. draw();//此时调用的是父类的方法 还是 子类的方法
    20. System.out.println("After invoke Glyph.draw()");
    21. }
    22. }
    23. class RoundGlyph extends Glyph{
    24. private int radius = 1;
    25. RoundGlyph(int r){
    26. radius = r;
    27. System.out.println("RoundGlyph.RoundGlyph.radius = "+radius);
    28. }
    29. void draw() {
    30. System.out.println("RoundGlyph.draw() = "+radius);
    31. }
    32. }
    33. public class PolytConstructor {
    34. public static void main(String[] args) {
    35. new RoundGlyph(5);
    36. }
    37. }

    **