Java向上转型与向下转型知识点整理

本篇博客的由来是自己对于java多态里的向上转型与向下转型概念及用法不明了,所以查询资料整理如下所示,参照了许多大神的写法,终有所掌握。

概念

Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。

向上转型:父类的引用指向子类对象,自动进行类型转换。换言之,子类对象转为父类,其中父类可以是接口。
公式: <父类型> <引用变量名> = new <子类型>();
即 Father f = new Son();Father是父类或接口,Son是子类。

向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换。换言之,父类对象转为子类(为了将向上转型的对象还原)。
公式:<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
即 Father f; Son s = (Son)f;

代码块

向上转型

public class Main {    public static void main(String[] args) {        Animal animal = new Dog(); //向上转型        animal.eat(); //狗吃骨头        animal.run();// warn!向上转型后父类引用不能调用子类自己的方法, 调用run方法会报错    }}class Animal {    public void eat(){        System.out.println("animal");    }}class Dog extends Animal{    public void eat(){        System.out.println("狗吃骨头");    }    public void run(){        System.out.println("狗追猫,追不上,摔了一跤");    }}

分析:这里用到了向上转型,换言之,就是用父类的引用变量去引用子类的实例,这是允许的。当向上转型之后,父类引用变量可以访问子类中属于父类的属性和方法,但是不能访问子类独有的属性和方法。
案例中由于子类重写了父类的 eat() 方法,所以调用的 eat() 方法是子类的 eat() 方法,输出结果为:“狗吃骨头”;然而当调用子类独有的 run() 方法时会报错。

向下转型
并不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型。

Animal animal= new Dog();Dog dog = ((Dog) animal);

分析:上述代码是允许的,因为animal引用的对象原本就是Dog对象向上转型得到的,在对animal向下转型后得到的还是Dog类的对象,能够被Dog类的引用变量引用。

如果还有一个Cat类继承了Animal类,然后实例化Dog类,并新建一个Animal类的引用变量“animal”引用该实例,然后新建一个Cat类的引用变量,引用向下转型的“animal”变量,代码如下:

Animal animal= new Dog();Cat cat= (Cat) animal;

分析:上述代码在运行的时候会报错,因为animal对象是由Dog对象向上转型得到的,只能够向下转型成Dog对象,不能够向下转型成Cat对象。

转型的好处

代码如下:

class Fruit{public void show() {System.out.println("this is a fruit");}}class Apple extends Fruit{    public void show() {System.out.println("this is a apple");    }    public void test() {System.out.println("i am a apple");    }}class Orange extends Fruit{    public void show() {System.out.println("this is a Orange");    }    public void test() {System.out.println("i am a Orange");    }}public static void run(Fruit fruit) {//假设在主类中定义了一个run()方法,该方法传入一个Fruit参数,并调用了Fruit对象的show()方法,fruit.show();}public static void main(String[] args) {    run(new Fruit());    run(new Apple());    run(new Orange());}

分析:上述代码中,调用run()方法时的参数不仅是Fruit对象,也可以是Apple对象和Orange对象,当传入的是Apple对象和Orange对象时,就会向上转型成Fruit对象,但是调用的show()方法还是Apple对象和Orange对象的show()方法。这样就不需要在主类中同时重载三个run()方法,减少了代码量。

来源:https://www.icode9.com/content-1-902701.html

(0)

相关推荐

  • 多态

    多态 即同一方法可以根据发送对象的不同而采用多种不同的行为方式 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多 注意: 多态是方法的多态,属性没有多态 有父类和子类的关系,类型转换异常: ...

  • Java向上转型和向下转型

    一.向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量, 基本的实现语法: 父类类型变量=new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调 ...

  • 数字化转型:大势所趋下的机遇与挑战

    数字化转型:大势所趋下的机遇与挑战

  • 时代大变局与经济大转型的环境下,少儿为什么要学习财商教育?

    时代大变局与经济大转型的环境下,少儿为什么要学习财商教育? 说到财商,不少人都津津乐道,有自己的心得体会.说到少儿财商,不少家长就十分陌生了,家长们热衷于各种培训班,才艺班,补习班,但是对少儿财商能力 ...

  • 大观集团董事长凡哲浩:追随消费转型升级 布局下一片大蓝海

    从决定创业开始,大观控股集团经历了从单一的资产管理业务,到多元的资产管理.风险投资.PE业务.再到综合性的产融结合业务三个阶段.通过4年的发展目前拥有全资或控股公司18家,业务主要分布于长三角地区. ...

  • 新时期数字化转型大趋势下-传统企业IT架构和组织重塑

    在前几天,我专门写了一篇文章谈企业数字化技术发展趋势分析,整个分析比较宏观.今天主要还是想聚焦回IT和信息化部门,探讨下数字化转型下的IT架构和能力重构. 在谈这个这个话题前,首先还是对去年我在华南C ...

  • 上山下海:风电装备企业与设计院如何在压力下转型再启航

    双节刚过半,三峡新能源山东省牟平BDB6一期(300MW-招标编号TGT-XNY-JA202070D)海上风电项目EPC总承包招标结果开始公示:中国电建集团中南勘测设计研究院有限公司为第一候选中标人. ...

  • 捷信中国:危机下HR要敏捷转型 提升不确定性下的适应性

    为了更好地应对疫情对企业管理带来的影响,了解人力资源管理视角下疫情对企业运营与增长的影响程度,剖析当下企业所面临的挑战与机遇,探寻可行的解决策略,HRoot旗下<人力资本管理>杂志邀请了数 ...

  • 传统药企的互联网转型:线下发展25年后,全面拥抱互联网医院

    今年上半年,动脉网分析了截至4月30日的497家互联网医院的建设发展状况:在综合互联网医院建设数量占据绝对优势的情形下,专科互联网医院以其专业优势获得了独特的发展机会.而在今年10月底,国家卫健委指出 ...

  • 八下英语知识点与语法点汇总

    一. 形容词/副词的比较级和最高级 1. 形容词/副词的比较级和最高级的构成规则 (1)单音节词和少数以-er,-ow结尾的双音节单词,比较级在后面加-er,最高级在后面加-est. ① 单音节单词 ...