向上转型读书笔记

preliminary
最近在读Thinking in Java这篇是一个基本此书的整理。

什么是向上转型upcast?

对象既可以作为它本身的类型使用,也可以作为它的基类类型使用(upcast)。
把这种对某个对象的引用 视为 对其基类的引用的做法被称作向上转型。
举例
父类 Instrument
子类 Wind
子类重写了play方法

javaclass Instrument {
    public void play(Note n){
        Prt.prt("Instrument.play()");
    }
}

class Wind extends Instrument{
    public void play(Note n){
        Prt.prt("Wind.play()" + n);
    }
}

public class Music {
    public static void tune(Instrument i)
    {
        i.play(Note.MIDDLE_C);
    }
    public static void main(String[] args) {
        Instrument flute = new Wind();
        tune(flute);
    }
}
\\output:
\\Wind.play() MIDDLE_C

如果一个函数的方法Music.tune()接受一个Instrument的引用,那么它同时也接受任何Instrument的子类(Wind)。
这说明Instrument的接口必定存在于Wind中。(或者继承/或者重写了)

upcast 的问题

从子类向上转型到父类,可能会缩小接口。因为向上转型之后使用Instrument引用进行访问,只能访问父类Instrument定义的接口,而不能访问Wind自己定义的新接口。

为什么要用upcast?

用了upcast就会让子类缩小接口,既然这样,为什么要用upcast?
【减少代码量】如果让tune()方法接受一个Wind引用作为自己的参数,似乎更为直观。但是,如果这样做,就需要系统为Instrument的每种类型都编写一个tune方法。这就意味着在开始时候,就需要更多的编程,这也意味着以后想添加类似tune()新方法,或者添加自Instrument导出的新类,仍需要做大量的工作。
【重载】此外,如果我们忘记重载某个方法,编译器也不会返回任何错误info,关于类型的整个处理过程,就难以操作.

你可能感兴趣的:(java编程思想读书笔记,向上转型,java)