简单使用

声明一个父类Father,子类Son继承Father

Father a = new Son() // 父类引用、子类对象(向上转型)

Son b = (Son)a // 向下转型,强制转换

// 父类引用转成子类引用

向上转型实例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(); // 调用的是子类eat()

//! error: b.fly();

// b虽指向子类对象,但此时子类作为向上转型的代价丢失和父类不同的fly()方法------

dosleep(new Male());

dosleep(new Female());

}

public static void dosleep(Human h) {

h.sleep();

}

}public class Human {

public void sleep() {

System.out.println("Human sleep..");

}

}

class Male extends Human {

@Override

public void sleep() {

System.out.println("Male sleep..");

}

}

class Female extends Human {

@Override

public void sleep() {

System.out.println("Female sleep..");

}

}

这里就可以看出向上转型的好处和使用场景了public static void dosleep(Human h) {

h.sleep();

}

这里的参数类型是父类,传入的值是子类,这就完成了向上转型操作。然后会自动判断调用该子类的对应方法。试想,如果我们这么干public static void dosleep(Male male) {

male.sleep();

}

public static void dosleep(Female fe) {

fe.sleep();

}

......

这是人,要换成水果,给你来个几百种,不写死才怪。

因此向上转型很好的简化了代码,也正是体现了java的抽象编程思想,使代码变得解耦。

向下转型实例class Fruit

{

public void myName()

{

System.out.println("我是父类 水果...");

}

}

class Apple extends Fruit

{

@Override

public void myName()

{

System.out.println("我是子类 苹果...");

}

public void myMore()

{

System.out.println("我是你的小呀小苹果~~~~~~");

}

}

public class Sys{

public static void main(String[] args) {

Fruit a=new Apple(); //向上转型

a.myName();

Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)

aa.myName();//向下转型时调用的是子类的

aa.myMore();;

Fruit f=new Fruit();

Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错

aaa.myName();

aaa.myMore();

}

}

输出:我是子类  苹果...

我是子类  苹果...

我是你的小呀小苹果~~~~~~

Exception in thread "main" java.lang.ClassCastException: com.sheepmu.Fruit cannot be cast to com.sheepmu.Apple

at com.sheepmu.Sys.main(Sys.java:30)

解释:正确的向下转型Fruit a=new Apple(); //向上转型

a.myName();

Apple aa=(Apple)a; //向下转型,编译和运行皆不会出错(正确的)

aa.myName();//向下转型时调用的是子类的

a指向子类的对象,所以子类的实例aa也可以指向a

向下转型后因为都是指向子类对象,所以调用的当然全是子类的方法错误的向下转型Fruit f=new Fruit();

Apple aaa=(Apple)f; //-不安全的---向下转型,编译无错但会运行会出错

aaa.myName();

aaa.myMore();

这里f指向父类对象,子类实例肯定不能指向f

3.Java为了解决不安全的向下转型问题,引入泛型的概念

4.为了安全的类型转换,最好先用 if(A instanceof B) 判断一下对象类型

例:if (f instanceof Apple){

Apple aaa=(Apple)f;

aaa.myName();

aaa.myMore();

}

参考文章:https://blog.csdn.net/sheepmu/article/details/38327205

php 向下转型的方法,向上转型和向下转型相关推荐

  1. c# 整数除法取整_c# 三种取整方法 向上取整 向下取整 四舍五入

    c# 三种取整方法 向上取整 向下取整 四舍五入 Math.Round:四舍六入五取整 Math.Ceiling:向上取整,只要有小数都加1 Math.Floor:向下取整,总是舍去小数 public ...

  2. c语言的除法向上还是向下取整,【向上取整/向下取整】C語言向上或向下取整 函數...

    C語言有以下幾種取整方法: 1.直接賦值給整數變量.如: int i = 2.5; 或 i = (int) 2.5; 這種方法采用的是舍去小數部分 2.C/C++中的整數除法運算符"/&qu ...

  3. Java 转型问题(向上转型和向下转型)

    Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象. 什么叫父类引用指向子类对象? 从 2 个名词开始说起:向上转型(upcasting) .向下转型(downcasting). 举 ...

  4. java 使用class转型_java中向上转型(upcast)和向下转型(downcast)

    先看下面的程序: class Useful { int value = 20; public void f() {System.out.println("f() in the Useful ...

  5. Java面向对象:多态——基于继承的向上转型、方法重写、动态绑定

    Java面向对象:多态 1.多态的概念 2.向上转型和向下转型 (1)向上转型 (2)向下转型 3.方法重写 4.动态绑定与静态绑定 5.多态的优缺点 ======================== ...

  6. 创建一个Cycle类,它具有子类Unicycle,Bicycle和Tricycle。演示每一个类型的实例都可以经由ride()方法向上转型为Cycle。

    Thinking in Java 8.1 练习1 创建一个Cycle类,它具有子类Unicycle,Bicycle和Tricycle.演示每一个类型的实例都可以经由ride()方法向上转型为Cycle ...

  7. 金融系列白皮书 |《金融业线上渠道转型的方法与实践》上线

    今日,神策数据推出金融行业数字化转型系列白皮书之<金融业线上渠道转型的方法与实践>,聚焦金融业数字化转型的常见问题,提出金融业的数字化转型基本思路,并附以金融业数字化转型 MVP 实践. ...

  8. 从趋势到必选项,探讨企业数字化转型方式方法

    本文分享自华为云社区<企业数字化转型方式方法的探讨>,作者: Uncle_Tom . 1. 数字经济和数字化转型 1.1. 数字经济成为未来竞争的主战场 数字经济是未来世界经济竞争格局的战 ...

  9. 数字化转型知识方法系列之三:以价值效益为导向推进数字化转型的五大重点任务

    数字化转型知识方法系列之三:以价值效益为导向推进数字化转型的五大重点任务 人工智能技术与咨询 一.数字化转型应围绕价值效益系统性推进 新一轮科技革命和产业变革迅猛发展,世界正处在一个从工业时代向信息时 ...

  10. 数字化转型知识方法系列之五:数字化转型战略

    数字化转型知识方法系列之五:数字化转型战略 人工智能技术与咨询 一.数字化转型是信息时代企业级核心战略   新一轮科技革命和产业变革迅猛发展,企业发展环境日益复杂多变,机遇挑战并存.全球经济从增量发展 ...

最新文章

  1. Eclipse中新建Maven项目没有java以及test目录
  2. Android 热修复之DexPatch 介绍
  3. MATLAB R2020a新鲜出炉,我来替各位尝尝鲜!
  4. 网站301重定向 解决方法
  5. 20岁,Universal GIS拥抱新生的GIS信创
  6. CentOS6.9快速安装配置svn
  7. c语言中的数组二分法排序程序,#C语言#二分法查找有序数组
  8. java 匿名初始化_Java:双括号初始化 /匿名内部类初始化法
  9. 全球开源正当时,第 19 届中日韩三国 IT 局长 OSS 会议暨东北亚开源软件推进论坛圆满落幕
  10. 苹果Mac智能照片编辑软件:​​​​Movavi Picverse
  11. vue filters使用
  12. Linux学习笔记5-linux中的磁盘
  13. 2020软考软件设计师--基础知识实战培训视频-任铄-专题视频课程
  14. LeetCode 到最近的人的最大距离
  15. zz 超级拖拉机 4.02 破解算法分析
  16. 看了它就能看懂心电图室大部分心电图
  17. 数据预处理-离群值检测与处理
  18. IBM小型机特性简介
  19. 贼好用的Java工具类库,GitHub星标13k+,很是厉害!
  20. 第9届全国大学生 GIS 技能大赛下午试题详解(下)附练习数据

热门文章

  1. 图文详解微信小程序如何实现微信授权登录(Java后台)下
  2. 【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之级联删除
  3. python解释器内置函数的功能_python 常用的内置函数
  4. Blender:使用立方体制作动漫头像
  5. VOC2007检测任务的评估标准
  6. LVM——缩小LVM分区(efx4)
  7. 【优化求解】基于蜉蝣算法MA(mayfly algorithm)求解单目标问题matlab源码
  8. 如何改变MySql数据库中 的排序_如何更改数据库的默认排序规则?
  9. 19KDD AccuAir Winning Solution to Air Quality Prediction for KDD Cup 2018
  10. 连接服务器出现黑屏怎么解决