preliminary
最近在读Thinking in Java这篇是一个基本此书的整理。
什么是向上转型upcast?
对象既可以作为它本身的类型使用,也可以作为它的基类类型使用(upcast)。
把这种对某个对象的引用 视为 对其基类的引用的做法被称作向上转型。
举例
父类 Instrument
子类 Wind
子类重写了play方法
java
class 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,关于类型的整个处理过程,就难以操作.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。