[Java] 编程思想 - 多态

avatarplhDigital nomad

再论向上转型

public class Music {
    public static void tune(Instrument i) {
        // ...
        i.play(Note.MIDDLE_C);
    }

    public static void main(String[] args) {
        Wind flute = new Wind();
        tune(flute); // Upcasting
    }
}

向下转型的类型识别, RTTI 运行时类型识别

当你像调用类型不匹配的函数,可以强制转换类型,就如同下面这种运行时识别类型。

class Useful {
    public void f() {}
    public void g() {}
}

class MoreUsefull extends Useful {
    public void f() {}
    public void g() {}
    public void u() {}
    public void v() {}
    public void w() {}
}

public class RTTI {
    public static void main(String[] args) {
        Useful[] x = {
            new Useful(),
            new MoreUsefull()
        };
        x[0].f();
        x[1].g();
        ((MoreUsefull)x[1]).u();
        ((MoreUsefull)x[1]).v();
        ((MoreUsefull)x[1]).w();
        //((MoreUsefull)x[0]).u(); // Error: ClassCastException
    }
}