[向上转型]

[子类的对象也是父类的对象]
[向上转型]
现在我是读程序时 是一套思路,看书上概念是一套思路。

还是对概念上的理解有些问题,从程序上的理解和看书上的文字的理解完全是相反的。


这是从书上的理解:
向上转型 是把子类的对象转变为父类的对象 。
那么子类里独有的方法就不能调用了,这也是一般与特殊的关系


从程序上理解的
向上转型是把父类的对象转变成子类的对象。

class Wind extends Instrument {
public static void tune(Instrument i)

Wind flute=new Wind();
tune(flute); //向上转型
把(flute)传给 tune(Instrument i)等于把父类的对象变为
子类的对象了


那么 既然都是继承自Object 又是继承的关系 子类里已经把父类里的方法和属性继承
过来了 为什么还要向上转型呢。是可以少写程序代码吗?没看出来呀。

现在我已经彻底晕了,这是研究JAVA以来碰到的最大难题。到底怎么理解才正确呢?

你没有看下去,第一个例子并没有真正实现向上转型。

:::Upcasting::: 也叫“上溯造型”吧~

因为我们画类图时经常这样:

父类

|
|
子类


在使用子类时,将子类自动转换成父类,这就常被称为“上溯”,即Upcasting...

为什么要有Upcasting? 按照上面的code,Instrument有一个method ,tune,它accept一个Instrument的一个实例,不管什么乐器,如Wind,可以用tune(Wind的一个实例)来调用,这时这个Wind的实例自动Upcasting成一个Instrument类型,最终成功执行了这个tune方法。

如果没有Upcasting,假如这样想:我有10种乐器,都是Instrument的子类,每种乐器都要有tune方法,那么我们都要单独写出tune方法,tune方法接受的参数现在不写成Instrument类型(即不用Upcasting),而是写成“乐器类型1”,第2种乐器的tune方法接受的参数为“乐器类型2”......依次类推,这样写的话,理解起来好象比较容易(每种乐器类型都有自己的特有的tune方法,接受自己的这种特有类型的参数),但是代码量却是原有方案(Upcasting)的10倍了....

不知道我这样噜苏,有没有表达清楚~~

我记起有一个rule:
抽象类应当拥有尽可能多的共同代码,共同的代码应尽可能多地向等级结构的上方移动。


另一句:
所有的继承都应从抽象类开始,具体类都不应有子类。
(这句请bang评论~~) :)