Java 向上转型和向下转型的详解

转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口

eg: Father f=new Son();

向下转型:父类引用的对象转换为子类类型称为向下转型。

eg: Son s=(Father)f;

一般在调用子类特有的方法时,需要向下转型,向下转型时可能会出现类型转换异常,

此时,可以使用"instanceOf"方法判断其对象是否是某类的示例,在运行时动态判断引用指向的对象的类型.

前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类重写了父类的方法就根据这个引用指向调用子类重写的这个方法(这个方法就是覆盖override)。这个调用过程就称为“动态绑定”。

转型需要注意的问题:

向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。

实例如下:

public class Animal {public void eat(){System.out.println("animal eatting...");}
}class Bird extends Animal{public void eat(){System.out.println("bird eatting...");}public void fly(){System.out.println("bird flying...");}
}class Main{  public static void main(String[] args) {Animal b=new Bird(); //向上转型b.eat();b.fly(); //此处提示在Animal中没有定义fly方法。}

在向下转型过程中,分为两种情况:

情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。

情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。

实例如下

public class Girl {public void smile(){System.out.println("girl smile()...");}
}class MMGirl extends Girl{@Overridepublic void smile() {System.out.println("MMirl smile sounds sweet...");}public void c(){System.out.println("MMirl c()...");}
}class main{public static void main(String[] args) {Girl g1=new MMGirl(); //向上转型g1.smile();MMGirl mmg=(MMGirl)g1;  //向下转型,编译和运行皆不会出错mmg.smile();mmg.c();Girl g2=new Girl();//MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错//mmg1.smile();//mmg1.c();if(g2 instanceof MMGirl){MMGirl mmg1=(MMGirl)g2;mmg1.smile();mmg1.c();}}

总结:

1、父类引用可以指向子类对象,子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

   如Father father = new Son();

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。

   如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;

   其中father前面的(Son)必须添加,进行强制转换。

4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效

5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Java多态中的 向上转型/向下转型相关推荐

  1. 【零基础学Java】—对象的向上和向下转型(二十七)

    [零基础学Java]-对象的向上转型(二十七) 对象的向上转型,其实就是多态的写法 格式:父类名称 对象名=new 子类名称(): 含义:右侧创建一个子类对象,把它当做父类来看待使用 注意事项:向上转 ...

  2. Java从入门到放弃09---多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别

    Java从入门到放弃09-多态/向上转型/向下转型/多态内存图/抽象类/关键字abstract不能和哪些关键字共存/接口/类与类,类与接口,接口与接口的关系/抽象类与接口的区别 01 多态 多态指的是 ...

  3. Java 中的上转型和下转型

    在我们的日常中,上转型和下转型都使用的比较少,所以当别人问起来什么是上转型,什么是下转型,自己往往一片模糊,或者不能将他们进行明显的区分. 在这里,我将以我个人理解来论述上下转型,希望对大家有帮助,如 ...

  4. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  5. 关于java多态中覆盖的理解

    在前面一篇文章中,我已经介绍了关于java多态中重载的理解与规则 所以这篇文章主要介绍多态中的覆盖机制. 首先重载与覆盖除了表现方式不同之外,还有运行时间上的不同,重载是在编译期间就已经可以确定好调用 ...

  6. JAVA中多态以及向上转型向下转型、重写的讲解

    重写 重写(override):也称为覆盖.重写是子类对父类非静态.非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 注意!!!返回值和形参都不能改变. 重写的好处在于子 ...

  7. Java接口,多态,向上转型,向下转型的意义

    接口 官方解释: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现 ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 包含 ...

  8. java:多态详解,以及对象的向上和向下转型

    大家好,兔胆包天我又来啦,今天给大家分享的是多态,多态最主要的是父类引用指向子类对象,还是老办法,直接上代码,代码中注解的很详细哦. 这是第一个代码: //测试多态 public class Anim ...

  9. 访问修饰符、常见的包以及包的权限和包的导入(inport关键字)、继承(super关键字)、多态(向上和向下转型)

    IDEA中快捷生成getter/setter的快捷键为 alt+inser(enter) getter/setter命名规范:都是以gte/set单词开头+要操作的属性名称 一.访问修饰符 Java中 ...

最新文章

  1. 非单身勿点,这里是单身汪专属情人节~
  2. About DotNetNunk
  3. Lintcode189 First Missing Positive solution 题解
  4. 设计模式--观察者(Observer)模式
  5. 小波的秘密5_多分辨率分析和连续小波变换2
  6. 有关linux下redis overcommit_memory的问题
  7. Hadoop 2.6.0 HA高可用集群配置详解
  8. 内置函数的数据聚合NumpyPandas
  9. 语音信号处理的一些基础知识
  10. Linux 系统常见命令功能大全_【all】
  11. AI面试需要注意哪些事项?
  12. android中点击空白处隐藏软键盘
  13. 树莓派开机自启动opencv程序脚本及报错分析及拓展
  14. web浏览器上画图之raphael
  15. 基于JAVA图书馆座位预约管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  16. 接电路要用计算机测试嘛,ZY6502-PC型消防接口、水枪水压性能试验机
  17. 获取mumu模拟器日志
  18. db2diag.log 详解
  19. HDU -- 免费馅饼(ACM Step: 3.2.8)
  20. 相机与IMU标定教程

热门文章

  1. 倒计时 限制次数记录 公共操作/验证的静态类
  2. Vue3 使用moment进行时间转换
  3. moment如何转换时间戳 毫秒换成为秒的时间戳
  4. 富途韦莱韬悦脉脉《2022年股权激励研究报告》全文解读
  5. The reported blocks 801 needs additional 1 blocks to reach the threshold 0.9990 of total blocks 803.
  6. 苹果ppt_惊艳!苹果发布会最爱用的PPT动画,居然这么简单
  7. Centos通过yum安装Jenkins
  8. 表白墙网站源码 说出你的心声
  9. php文章cms插件,Phpcms v9百度神马后台勾选文章推送插件
  10. c语言中%p和0x%x,C语言中的%p和%x的区别