初学者在学习向上转型可能会很难理解,向上转型并不能调用子类特有属性和方法,我们必须先生成子类实例再赋值给父类引用(向上转型),然后将父类引用向下强制转换给子类引用(向下转型),这样才能调用子类中的所有成员。这看起来像是多次一举,还不如直接创建子类实例。

随着技术的提升,我们在学习其它开源项目时会发现很多地方都用了向上转型和向下转型的技术。本节将带大家了解向上转型和向下转型的意义及使用场景。

例 1
定义父类 Animal,代码如下:

public class Animal {public void sleep() {System.out.println("小动物在睡觉");}public static void doSleep(Animal animal) {// 此时的参数是父类对象,但是实际调用时传递的是子类对象,就是向上转型。animal.sleep();}public static void main(String[] args) {animal.doSleep(new Cat());animal.doSleep(new Dog());}
}

子类 Cat 代码如下:

public class Cat extends Animal {@Overridepublic void sleep() {System.out.println("猫正在睡觉");}
}

子类 Dog 代码如下:

public class Dog extends Animal {@Overridepublic void sleep() {System.out.println("狗正在睡觉");}
}

输出结果为:

猫正在睡觉
狗正在睡觉

如果不用向上转型则必须写两个 doSleep 方法,一个传递 Cat 类对象,一个传递 Dog 类对象。这还是两个子类,如果有多个子类就要写很多相同的方法,造成重复。可以看出向上转型更好的体现了类的多态性,增强了程序的间接性以及提高了代码的可扩展性。当需要用到子类特有的方法时可以向下转型,这也就是为什么要向下转型。

比如设计一个父类 FileRead 用来读取文件,ExcelRead 类和 WordRead 类继承 FileRead 类。在使用程序的时候,往往事先不知道我们要读入的是 Excel 还是 Word。所以我们向上转型用父类去接收,然后在父类中实现自动绑定,这样无论你传进来的是 Excel 还是 Word 就都能够完成文件读取。

总结如下:

  • 把子类对象直接赋给父类引用是向上转型,向上转型自动转换。如 Father father = new Son();
  • 指向子类对象的父类引用赋给子类引用是向下转型,要强制转换。使用向下转型,必须先向上转型,为了安全可以用 instanceof 运算符判断。
    如 father 是一个指向子类对象的父类引用,把 father 赋给子类引用 son,即 Son son
    =(Son)father;。其中 father 前面的(Son)必须添加,进行强制转换。
  • 向上转型不能使用子类特有的属性和方法,只能引用父类的属性和方法,但是子类重写父类的方法是有效的。
  • 向上转型时会优先使用子类中重写父类的方法,如例 1 中调用的 sleep 方法。
  • 向上转型的作用是减少重复代码,可以将父类作为参数,这样使代码变得简洁,也更好的体现了多态。

1.6 为什么使用向上转型而不直接创建子类对象?相关推荐

  1. 1.5 对象类型转换:向上转型和向下转型

    将一个类型强制转换成另一个类型的过程被称为类型转换.本节所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,会抛出 Java 强制类型转换(ja ...

  2. chapter7 面向对象之向上转型、向下转型及多态

    文章目录 1.对象类型转换 1.1向上转型 1.2向下转型 2.多态 1.对象类型转换 将一个类型强制转换成另一个类型的过程被称为类型转换.本节所说的对象类型转换,是指存在继承关系的对象,不是任意类型 ...

  3. 多态的向上转型与向下转型

    多态的向上转型与向下转型 多态的转型分为向上转型与向下转型两种: A:向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程. 使用格式: 父类类型  变量名 = new ...

  4. java类型转换——向上转型,向下转型

    类型转换 我们通常把将一个类型强制转换为另外一个类型的过程称之为类型转换,本文所提到的对象类型转换,特指存在继承关系的对象,因为在Java中不存在继承关系的对象进行转换的时候会抛出java强制类型转换 ...

  5. 【JAVA】关于向上转型与向下转型

    向上转型: 子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 如果子类重写了父类的方法,就根据这个引用指向调用子类重写的这个方法,不是调用父类的, ...

  6. JavaSE基础知识(十八)--Java多态之向上转型(多态初步)

    Java SE 是什么,包括哪些内容(十八)? 本文内容参考自Java8标准 再次感谢Java编程思想对本文的启发! 开篇一句很重要的话:在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种 ...

  7. 【Java SE】继承;组合;向上转型;动态绑定;方法重写;静态绑定;多态;抽象类;接口;

    面向对象编程 文章目录 1. 包 1.1 导入包中的类 1.2 静态导入 1.3 将类放到包中 1.4 包的访问权限控制 1.5 常见的系统包 2. 继承 2.1 语法规则 2.2 protected ...

  8. Java学习(9)(3种向上转型的方式、重写、向下转型、多态的优缺点、抽象类【基础规则、抽象类的作用】接口【基础规则、 接口的使用】)

    接上次博客:JAVA学习(8)继承 ( 继承的注意事项.Java的执行顺序.继承方式.限定词protcted.final关键词.多态.动态绑定和静态绑定 )_di-Dora的博客-CSDN博客 目录 ...

  9. java向上转型不能调用子类独有的方法

    向上转型只能够调用子类重写的方法,子类独有的方法在父类中根本没有定义,所以父类无法找到子类独有的方法. package com.company;public class Main {public st ...

最新文章

  1. WebService教程和分析
  2. python的知识点总结云分享_Python工程师面试必备25条Python知识点
  3. 西瓜书学习记录-神经网络(第五章)
  4. 【渝粤题库】国家开放大学2021春2044教育研究方法题目
  5. 一文看懂响应率模型开发内容
  6. Must read C++ book list
  7. Jenkins:安装出现“该jenkins实例似乎已离线”问题解决
  8. 安全检查计算机,计算机可以通过安全检查机吗?
  9. 2021 HTML面试题(最新)不定时更新
  10. 小米6自动重启android,小米6充电重启怎么办?小米6充电自动重启解决方法介绍...
  11. 在线剪切板,一款高效方便记录剪切板内容的在线工具
  12. 【Spring Cloud】新闻头条微服务项目:自媒体前后端搭建素材管理(含优化)
  13. 机器取代人的智造年代,你靠什么掌舵?
  14. 远程登录Linux系统
  15. 华为上诉失败,被禁止在瑞典销售 5G 设备;苹果公司市值重获全球第一;Deno 完成 2100 万美元 A 轮融资|极客头条
  16. 【转】PC机安装MAC虚拟机
  17. 麒麟操作系统基于linux哪个版本_linux操作系统排行_桌面操作系统难在哪?国产麒麟系统应用仅为Windows十...
  18. c 语言 测试工具,几种C/C++语言安全检测工具介绍
  19. 【捌】小白必备的房·地·产投·资神器——REITs
  20. 数据结构与算法 张铭 教材源代码

热门文章

  1. ML之HierarchicalClustering:自定义HierarchicalClustering层次聚类算法
  2. AdaBoost算法特性
  3. errno_t open_s()打开文件出现的错误分析
  4. nginx+uWSGI+django+virtualenv+supervisor发布web服务器
  5. 【转】五、谈扩展方法的理解
  6. (三)页面之间的参数传递
  7. android开发 权限大全
  8. 嵌入式培训学习历程第二十二天
  9. 回调函数到底是怎么一回事呢
  10. 字库点阵测试程序代码