美文网首页Java开发那些事
Java多态-构造器内部的多态方法的行为

Java多态-构造器内部的多态方法的行为

作者: 马拉松Mara | 来源:发表于2017-10-31 22:30 被阅读12次

    问题

    如果在一个构造器内部,调用正在构造的对象的某个动态绑定方法,那会发生什么情况呢?

    代码

    class Glyph {
        void draw() {
            print("Glyph.draw()");
        }
    
        /**
         * 在基类的构造器中,调用动态绑定的方法(此方法被导出类覆盖)
         *
         */
        Glyph() {
            print("Glyph() before draw()");
            draw();
            print("Glyph() after draw()");
        }
    }
    
    class RoundGlyph extends Glyph {
        private int radius = 1;
    
        RoundGlyph(int r) {
            radius = r;
            print("RoundGlyph.RoundGlyph(), radius = " + radius);
        }
    
        @Override
        void draw() {
            print("RoundGlyph.draw(), radius = " + radius);
        }
    }
    
    class RectangularGlyph extends Glyph {
        private int width = 4;
    
        private int height = 5;
    
        RectangularGlyph(int width, int height) {
            this.width = width;
            this.height = height;
            print("RectangularGlyph.RectangularGlyph(), width = " + width + ", height = " + height);
        }
    
        void draw() {
            print("RectangularGlyph.draw(), area = " + width *
                    height);
        }
    }
    
    /**
     * 在基类构造器中,调用动态绑定的方法,则导出类方法被调用时,导出类的成员实际上还未被初始化;
     * 当调用到导出类的构造器时,导出类的成员已经被初始化了;
     */
    public class E15_PolyConstructors2 {
        public static void main(String[] args) {
            new RoundGlyph(5);
            print("------------------------------");
            new RectangularGlyph(2, 2);
        }
    }
    

    输出结果

    Glyph() before draw()  
    RoundGlyph.draw(), radius = 0
    Glyph() after draw()
    RoundGlyph.RoundGlyph(), radius = 5
    ------------------------------
    Glyph() before draw()
    RectangularGlyph.draw(), area = 0
    Glyph() after draw()
    RectangularGlyph.RectangularGlyph(), width = 2, height = 2
    

    结论

    类初始化的实际过程是:

    1. 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
      这也解释了为何基类构造器中调用动态绑定方法时为何 radius = 0area = 0
    2. 调用基类构造器
    3. 按照声明的顺序调用成员的初始化方法
    4. 调用导出类的构造器主体
      这解释了导出类构造器中为何:radius = 5width = 2, height = 2

    相关文章

      网友评论

        本文标题:Java多态-构造器内部的多态方法的行为

        本文链接:https://www.haomeiwen.com/subject/knvipxtx.html