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

例子

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

    void draw() {
        System.out.println("draw()");
    }
}
public class Animal extends LivingCreature {
    private int radius = 1;

    Animal(int r) {
        radius = r;
        System.out.println("Animal() radius=" + radius);
    }

    @Override
    void draw() {
        System.out.println("Animal() draw radius=" + radius);
    }

    public static void main(String[] args) {
        LivingCreature animal = new Animal(5);
        LivingCreature livingCreature = new LivingCreature();
        animal.draw();
        livingCreature.draw();
    }
}

结果

before draw()
Animal() draw radius=0
after draw()
Animal() radius=5
before draw()
draw()
after draw()
Animal() draw radius=5
draw()

解释

说实话和我预期是不一样的,但是为啥会出现这种情况呢?涉及到方法的动态绑定(编译好的是符号引用),具体是依赖于你初始化的对象是导出类还是基类的。

不过话说回来,正常的构造器是不会这样写的,构造器就是给对象初始化用的,但是不排除一些特殊情况,比如你初始化几个特别属性单独写了个方法给构造器调用,但是这个方法不应该被设计为可继承。

你可能感兴趣的:(java复习笔记)