• 关于Java上下转型


    目录

    1、转型语法

    2、定义类

    3、向上转型

    4、向下转型

    4.1 问题1:

    4.2 向下转型:

    4.3 问题2:

    4.4 问题3:

    5、向下转型问题的解决办法

    6、总结


    1、转型语法

    首先了解转型的定义:

    1、向上转型:父类 父类引用 = new 子类(天然发生的)

    2、向下转型:子类 子类引用 = (子类)父类;(强制类型转换)

    2、定义类

    1. // 定义动物基类
    2. public class Animal extends Object {
    3. public void move() {
    4. System.out.println("动物在移动");
    5. }
    6. }
    7. // 定义Cat类
    8. public class Cat extends Animal {
    9. //重写父类中继承的方法
    10. public void move() {
    11. System.out.println("猫在走猫步");
    12. }
    13. public void catchMouse() {
    14. System.out.println("猫抓老鼠");
    15. }
    16. }
    17. // 定义Bird类
    18. public class Bird extends Animal {
    19. public void move() {
    20. System.out.println("鸟儿在飞翔");
    21. }
    22. public void fly() {
    23. System.out.println("Bird fly");
    24. }
    25. }

    3、向上转型

    1. public class Test01 {
    2. public static void main(String[] args) {
    3. Animal a2 = new Cat(); // 天然发生的向上转型,猫一定是动物,但动物不一定是猫
    4. a2.move();
    5. c2.catchMouse();
    6. }
    7. }

    4、向下转型

    4.1 问题1:

    如果对象调用的方法是父类中没有的,(比如调用catMouse方法),会报错。因此此处就需要用到强制类型转换(向下转型)。

    4.2 向下转型:

    1. public class Test {
    2. public static void main(String[] args) {
    3. Animal a2 = new Cat();//向上转型
    4. a2.move();
    5. Cat c2 = (Cat) a2;//向下转型:将Animal类型的a2转换为Cat类型的c2
    6. c2.catchMouse();
    7. }
    8. }

    4.3 问题2:

    如果测试程序这样写:

    1. public class Test {
    2. public static void main(String[] args) {
    3. Animal a3 = new Bird();
    4. Cat c3 = (Cat) a3;
    5. }
    6. }

     上述代码在编译阶段不会报错,但在运行阶段会报错,为什么呢?

    问题分析:

    ①首先,编译通过,因为编译器检测到a3的数据类型是Animal,因为Animal和Cat之间存在继承关系,且Animal是父类,Cat是子类,父类转换成子类,向下转型语法合格。

    ②程序虽然编译通过了,但是程序在运行阶段会抛出异常,因为JVM堆内存中真实存在的对象是Bird类型,Bird类型对象无法转换成Cat类型对象,因为二者不存在继承关系。

    4.4 问题3:

    如果测试代码这样写:

    1. public class Test {
    2. public static void main(String[] args) {
    3. //子类指向父类
    4. Animal a4 = new Animal();
    5. Cat c4 = (Cat) a4;
    6. }
    7. }

    上述代码同样编译不报错,但运行阶段会报错,为什么?

    问题分析:

    ①首先,编译通过说明转型的语法是不存在问题的。

    ②编译通过,但程序抛出异常,因为a4是Animal类型的对象,而c4指向的是子类对象Cat,子类对象不能指向父类对象。 

    5、向下转型问题的解决办法

    我们实操发现:进行向下转型时会遇到各种运行时异常情况,此时我们引入了关键字 instanceof(摘帽子,脱掉帽子看看究竟是哪种类型)

    1. public class Test {
    2. public static void main(String[] args) {
    3. //解决方式:
    4. Animal a3 = new Bird();
    5. if(a3 instanceof Cat) {
    6. Cat c3 = (Cat) a3;
    7. c3.catchMouse();
    8. } else if(a3 instanceof Bird) {
    9. Bird b2 = (Bird)a3;
    10. b2.fly();
    11. }
    12. }
    13. }

    6、总结

    ①只有有继承关系的类型之间才能进行类型转换;

    ②向上转型是天然发生的,但只能访问和调用到来自于父类的属性和行为;

    ③子类的引用不能指向父类或其他子类对象。

    ④把父类引用赋给子类引用,语法上必须使用强制类型转换,要想运行成功还必须保证父类引用指向的对象一定是该子类对象(最好使用instance判断后,再强转)

  • 相关阅读:
    倒计数(来源:Google Kickstart2020 Round C Problem A)(DAY 88)
    Java多线程并发编程核心知识
    机器学习笔记:轨迹驻留点 staypoint
    深入浅出Spring注解ConfigurationProperties
    QProcess 调用 ffmpeg来处理音频
    qdockwidget隐藏标题栏导致无法拖动问题
    vscode 源代码不能自动stage change
    2023 年前端编程 NodeJs 包管理工具 npm 安装和使用详细介绍
    数据结构——二叉树
    javaScript 中的localeCompare方法及其使用
  • 原文地址:https://blog.csdn.net/weixin_46972127/article/details/126249785