java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

什么叫父类引用指向子类对象,且听我慢慢道来.

从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).

举个例子:有2个类,Father是父类,Son类继承自Father。

Father f1 = new Son();   // 这就叫 upcasting (向上转型)

// 现在f1引用指向一个Son对象

Son s1 = (Son)f1;   // 这就叫 downcasting (向下转型)

// 现在f1还是指向Son对象

第2个例子:

Father f2 = new Father();

Son s2 = (Son)f2;       // 出错,子类引用不能指向父类对象

你或许会问,第1个例子中:Son s1 = (Son)f1;问什么 是正确的呢。

很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。

而f2 被传给了一个Father对象,Father f2 = new Father();子类s1引用不能指向父类对象。

总结:

1。父类引用指向子类对象,而子类引用不能指向父类对象。

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

      如:Father f1 = new Son();

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

   如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;

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

一、向上转型。

通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。

1,向上转型中的方法调用。

看下面代码:

package com.wensefu.others; 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(); //! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法dosleep(new Male());dosleep(new Female());}public static void dosleep(Human h) {h.sleep();} }

package com.wensefu.others; public class Human {public void sleep() {System.out.println("Human sleep..");} } class Male extends Human {@Overridepublic void sleep() {System.out.println("Male sleep..");} } class Female extends Human {@Overridepublic void sleep() {System.out.println("Female sleep..");} }

注意这里的向上转型:
        Animal b=new Bird(); //向上转型
        b.eat();

此处将调用子类的eat()方法。原因:b实际指向的是Bird子类,故调用时会调用子类本身的方法。

需要注意的是向上转型时b会遗失除与父类对象共有的其他方法。如本例中的fly方法不再为b所有。

2,向上转型的好处。

看上面的代码,

public static void dosleep(Human h) {
        h.sleep();
    }

这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,
如果dosleep以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了JAVA的抽象编程思想。

二、向下转型。

与向上转型相反,即是把父类对象转为子类对象。

看下面代码:

package com.wensefu.other1; 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(); /*output: * CGirl smile sounds sweet... * CGirl smile sounds sweet... * CGirl c()... * Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl * at com.wensefu.other1.Main.main(Girl.java:36) */if(g2 instanceof MMGirl){MMGirl mmg1=(MMGirl)g2; mmg1.smile();mmg1.c();}} }

Girl g1=new MMGirl(); //向上转型
        g1.smile();
       MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错

这里的向下转型是安全的。因为g1指向的是子类对象。


Girl g2=new Girl();
MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错

运行出错:

Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
    at com.wensefu.other1.Main.main(Girl.java:36)
如代码所示,可以通过instanceof来防止出现异常。

JAVA的向上转型与向下转型(二)相关推荐

  1. 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货

    –本文摘要–     1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者.     2.本文的内容摘要:讲述Java中的一 ...

  2. 重新精读《Java 编程思想》系列之向上转型与向下转型

    前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...

  3. 第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型

    学习笔记,仅供参考 文章目录 面向对象 多态 多态向上转型和向下转型 多态的好处和弊端 面向对象 多态 多态向上转型和向下转型 我们首先通过以下代码复习一下自动类型提升和强制类型转换: class B ...

  4. Java转型(向上转型和向下转型)

    在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就 ...

  5. [JAVA]向上转型与向下转型

    要理解多态性,首先要知道什么是"向上转型"."向下转型". 对象的多态性:父子类对象的转换 **向上转型:**子类对象变为父类对象,语法: 父类 父类对象 = ...

  6. Java中的向上转型及向下转型

    我们都知道Java的三大特性:封装.继承.多态. Java中的向上转型及向下转型体现了Java中的继承性及多态性,所谓继承,不难理解,存在于子父类间,子类继承父类中不被私有化的属性和方法.而多态性,顾 ...

  7. java 对象向上转型_JAVA对象向上转型和向下转型

    今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...

  8. JAVA中的向上转型和向下转型

    一.向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点:              1.这是继承过程中发生 ...

  9. java 向下转型运行时错误_Java向上转型和向下转型

    首先定义父类Animal,所有动物都有一个吃东西的方法:子类Dog还增加了一个叫的功能. public classAnimal {public voideat() { System.out.print ...

  10. java 泛型向下转型_Java向上转型和向下转型(附具体样例)

    Java向上转型和向下转型(附具体样例) 熬夜整理的关于Java向上和向下转型的样例,很的通俗易懂哦~~~~ 一.向上转型 package com.sheepmu; class Animal { pu ...

最新文章

  1. 卡巴斯基安全浏览器_卡巴斯基 for windows 全方位安全软件2021注册表清除版
  2. Exchange 2010迁移Exchange 2013(一)共存部署
  3. 小白入门深度学习 | 第三篇:30分钟入门深度学习 - TensorFlow版
  4. 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
  5. python 与零值比较,python – 使用另一个数据帧替换数据帧中的零值
  6. 运维自动化之何为版本控制?
  7. 解决Axure发布分享预览的3个方法
  8. jsp 如何上传文件到服务器上,如何使用JSP / Servlet将文件上传到服务器?
  9. C++ 访问成员 “->“还是“.“
  10. Verilog测试:TestBench结构
  11. Access、Trunk、Hybrid三种端口收发规则以及tagged端口和untagged端口的区别
  12. 小新air14学计算机,小新Air14对比小新Pro13哪个更香,盘点办公学习的
  13. linux下chm阅读器
  14. ant design pro中权限组件Authorized的个人学习
  15. CTF实验吧-简单的sql注入【SQL注入关键词绕过】
  16. python输出中文加数字_Python实现阿拉伯数字加上中文数字
  17. lex生成lex.yy.c代码流程解析
  18. JS知识点总结(全)
  19. T3软加密注册提示“获取激活参数失败,不能连接外网,请检查网络服务器网络状态”
  20. IC验证:静态时序分析

热门文章

  1. 排序评估指标——NDCG和MAP
  2. Lightoj 1258
  3. 五层协议体系结构的各层功能
  4. 增强低频和高频 matlab,实验名称高斯低频滤波及高频增强滤波.doc
  5. MISRA C (3)
  6. java毕业设计鸿鹄教育培训(附源码、数据库)
  7. 折半查找判定树的画法(较简单易懂!)
  8. 如何生成数据库设计文档
  9. Elasticsearch集群的脑裂问题
  10. 凯斯西储大学轴承数据介绍及处理