资讯专栏INFORMATION COLUMN

向上转型读书笔记

RdouTyping / 2849人阅读

摘要:把这种对某个对象的引用视为对其基类的引用的做法被称作向上转型。或者继承或者重写了的问题从子类向上转型到父类,可能会缩小接口。因为向上转型之后使用引用进行访问,只能访问父类定义的接口,而不能访问自己定义的新接口。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64170.html

相关文章

  • 《Java编程思想》读书笔记-对象导论

    摘要:而面向对象则是向程序员提供表示问题空间中元素的工具,我们将问题空间中的元素及其在解空间中的表示称为对象。为什么要把对象看作是服务提供者呢这是将问题分解为对象集合的一种合理方式。职能太多,可能会导致对象的内聚性降低。在试图将子类对象当作其基类 计算机是头脑延伸的工具,是一种不同类型的表达媒体。本文以背景性的和补充性的材料,介绍包括开发方法概述在内的面向对象程序设计(Object-orie...

    NickZhou 评论0 收藏0
  • 笔记】Java核心技术卷一读书笔记

    摘要:构造器没有返回值一个对象变量并没有实际包含一个对象,而仅仅引用一个对象,如有两个部分。子类重写方法的返回值范围必须小于等于父类方法的返回值。枚举类型中可以添加一些构造器方法和域。 第三章 Java是一种强类型语言。 https://blog.csdn.net/qq_3619... 在Java中,整型的范围与机器无关。 int 4字节 short 2字节 long ...

    weizx 评论0 收藏0
  • Java笔记 - 重写/重载,向上转型/向下转型

    摘要:所以静态方法不能被覆盖。虽然就算你重写静态方法,编译器也不会报错。也就是说,如果你试图重写静态方法,不会阻止你这么做,但你却得不到预期的结果重写仅对非静态方法有用。我们应该直接使用类名来访问静态方法,而不要使用对象引用来访问。 重写/重载 重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。所以静态方法不能被覆盖。 (如果从重写方法会有什么特点来看,我们是不能...

    qqlcbb 评论0 收藏0
  • 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    摘要:写在开头本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了。可移步笔者的文章中替换方式参考文档高级程序设计作者以乐之名本文原创,有不当的地方欢迎指出。 showImg(https://segmentfault.com/img/bVblGMc?w=600&h=400); 写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了。...

    iOS122 评论0 收藏0
  • 1、接口 2、多态

    摘要:接口的概念接口的概念接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的类。多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的类。 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定...

    Magicer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<