关于向上转型,你要了解的

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

什么是向上转型upcast?

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

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,关于类型的整个处理过程,就难以操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值