《Thinking in Java》第八章:构造器内部的多态方法的行为,对象初始化的顺序

这里会用到继承以及多态的知识点,但不会将这两项分开来描述,而是将这二者合在一起来讲一讲对象初始化的顺序。

这里是一段继承内部多态方法行为的代码。

class Glyph {
    void draw() {
        System.out.println("Glyph.draw");
    }

    Glyph() {
        System.out.println("Glyph() before draw()");
        draw();
        System.out.println("Glyph() after draw()");
    }
}

class RoundGlyph extends Glyph {
    private int radius = 1;

    RoundGlyph(int i) {
        radius = i;
        System.out.println("RoundGlyph.RoundGlyph(i).radius=" + radius);
    }

    void draw() {
        System.out.println("RoundGlyph.draw().radius=" + radius);
    }
}

public class ThePolymorphismInExtends {

    public static void main(String[] args) {
        new RoundGlyph(5);
    }
}
输出结果:
Glyph() before draw()
RoundGlyph.draw().radius=0
Glyph() after draw()
RoundGlyph.RoundGlyph(i).radius=5


为什么这个radius怎么会输出为0呢?
这就要说一说对象的是初始化顺序了。
1).在其他任何事物发生之前,分配给对象的存储空间初始化为0。
2).调用基类构造器,并在内部调用draw()方法,当时这个方法被覆盖了,所以只能调用覆盖过后的draw()方法,并在内部输出了radius。由于第一步,所以输radius出为0。
3).初始化实例对象。
4).调用导出类构造器。
大概的顺序就是先对导出类分配存储空间并初始化为0,也就是先对调用基类的构造方法(假如基类中需要初始化对象,那么就先初始化对象在调用基类构造器),然后初始化导出类里面的对象,最后调用导出类的构造方法。大概就是假如小兔子要出生的话就要有大兔子dad,但是你的形状已经确定了,只是具体能长成什么样子就看你自己了。
(欢迎指正批评!!!)

 

参考书籍:《Thinking in Java》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值