8 多态和构造器

目录

8.2 多态

8.3 构造器和多态


8.2 多态

Music:多态

class Instrument {
    void play() {
        System.out.println("Instrument!");
    }
};
class Wind extends Instrument {
    void play() {
        System.out.println("Wind!");
    }
};
class Percussion extends Instrument {
    void play() {
        System.out.println("Percussion!");
    }
};
class Music {
    static void tune(Instrument i) {
        i.play();
    }
    public static void chapter8_2() {
        Wind wind = new Wind();
        Percussion percussion = new Percussion();
        tune(wind);
        tune(percussion);
    }
};
输出:
Wind!
Percussion!

PrivateOverride:私有函数不支持多态,privateOverride.f()实际运行的是基类的f()。

class PrivateOverride {
    /*
    public void f() {
        System.out.println("PrivateOverride!");
    }
    */
    private void f() {
        System.out.println("PrivateOverride!");
    }
    public static void chapter8_2() {
        PrivateOverride privateOverride = new Derived();
        privateOverride.f();
        ((Derived)privateOverride).f();
    }
};
class Derived extends PrivateOverride {
    public void f() {
        System.out.println("Derived PrivateOverride!");
    }
}
输出:
PrivateOverride!
Derived PrivateOverride!

8.3 构造器和多态

构造器并不具有多态性,它们实际上是static方法,只不过声明是隐式的!!!

PolyConstructors:如果一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生灾难性的结果。

class Glyph {
    Glyph() {
        System.out.println("Glyph before draw:");
        draw();
        System.out.println("Glyph after draw:");
    }
    void draw() {
        System.out.println("Glyph draw()!");
    }
};
class RoundDraw extends Glyph {
    RoundDraw(int r) {
        radius = r;
        System.out.println("RoundDraw draw()!!! radius:" + radius);
    }
    private int radius = 2;
    void draw() {
        System.out.println("RoundDraw draw()! radius:" + radius);
    }
};
class PolyConstructors {
    public static void chapter8_3() {
        new RoundDraw(5);
    }
};
输出:
Glyph before draw:
RoundDraw draw()! radius:0
Glyph after draw:
RoundDraw draw()!!! radius:5

draw()前后radius打印不同,也就是说对于Glyph类来说打印draw看到的radius是个错误的值!!!

编写构造器时有一条有效的准则:"用尽可能简单的方法使对象进入正常状态,如果可以的话避免调用其他方法"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值