Thinking in java-26 构造函数多态

1. 代码

package com.fqyuan.thinking;

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

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

class RoundGlyph extends Glyph {
    private int radius = 1;

    public RoundGlyph(int radius) {
        this.radius = radius;
        draw();
    }

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

public class PolyConstructor {
    public static void main(String[] args) {
        new RoundGlyph(5);
    }
}

//Running result:
Glyph before draw()
RoundGlyph.draw(), radius = 0
Glyph after draw()
RoundGlyph.draw(), radius = 5

2. 解释

The order of initialization:
1). The storage allocated for the object is initialized to be binary zero before anything else happens.
2). The base-class constructors are called as described previously. At this point, the overridden draw() method is called(yes, before the RoundGlyph constructor is called), which discovers a radius value of zero, due to step 1.
3). Member initializers are called in the order of declaration.
4). The body of the derived-class constructor is called.
构造函数初始化顺序:
首先基类构造函数被调用。此时,被重写的override方法被调用了(是的,你没看错,被重写的方法在扩展类构造函数没有被调用时就被调用了),所以这里的类变量被初始化为默认值0 。
然后成员初始化按照被声明的顺序被初始化调用。
最后才执行的是扩展类的构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值