php 向下转型的方法,向上转型和向下转型
简单使用
声明一个父类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 向下转型的方法,向上转型和向下转型相关推荐
- c# 整数除法取整_c# 三种取整方法 向上取整 向下取整 四舍五入
c# 三种取整方法 向上取整 向下取整 四舍五入 Math.Round:四舍六入五取整 Math.Ceiling:向上取整,只要有小数都加1 Math.Floor:向下取整,总是舍去小数 public ...
- c语言的除法向上还是向下取整,【向上取整/向下取整】C語言向上或向下取整 函數...
C語言有以下幾種取整方法: 1.直接賦值給整數變量.如: int i = 2.5; 或 i = (int) 2.5; 這種方法采用的是舍去小數部分 2.C/C++中的整數除法運算符"/&qu ...
- Java 转型问题(向上转型和向下转型)
Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象. 什么叫父类引用指向子类对象? 从 2 个名词开始说起:向上转型(upcasting) .向下转型(downcasting). 举 ...
- java 使用class转型_java中向上转型(upcast)和向下转型(downcast)
先看下面的程序: class Useful { int value = 20; public void f() {System.out.println("f() in the Useful ...
- Java面向对象:多态——基于继承的向上转型、方法重写、动态绑定
Java面向对象:多态 1.多态的概念 2.向上转型和向下转型 (1)向上转型 (2)向下转型 3.方法重写 4.动态绑定与静态绑定 5.多态的优缺点 ======================== ...
- 创建一个Cycle类,它具有子类Unicycle,Bicycle和Tricycle。演示每一个类型的实例都可以经由ride()方法向上转型为Cycle。
Thinking in Java 8.1 练习1 创建一个Cycle类,它具有子类Unicycle,Bicycle和Tricycle.演示每一个类型的实例都可以经由ride()方法向上转型为Cycle ...
- 金融系列白皮书 |《金融业线上渠道转型的方法与实践》上线
今日,神策数据推出金融行业数字化转型系列白皮书之<金融业线上渠道转型的方法与实践>,聚焦金融业数字化转型的常见问题,提出金融业的数字化转型基本思路,并附以金融业数字化转型 MVP 实践. ...
- 从趋势到必选项,探讨企业数字化转型方式方法
本文分享自华为云社区<企业数字化转型方式方法的探讨>,作者: Uncle_Tom . 1. 数字经济和数字化转型 1.1. 数字经济成为未来竞争的主战场 数字经济是未来世界经济竞争格局的战 ...
- 数字化转型知识方法系列之三:以价值效益为导向推进数字化转型的五大重点任务
数字化转型知识方法系列之三:以价值效益为导向推进数字化转型的五大重点任务 人工智能技术与咨询 一.数字化转型应围绕价值效益系统性推进 新一轮科技革命和产业变革迅猛发展,世界正处在一个从工业时代向信息时 ...
- 数字化转型知识方法系列之五:数字化转型战略
数字化转型知识方法系列之五:数字化转型战略 人工智能技术与咨询 一.数字化转型是信息时代企业级核心战略 新一轮科技革命和产业变革迅猛发展,企业发展环境日益复杂多变,机遇挑战并存.全球经济从增量发展 ...
最新文章
- Eclipse中新建Maven项目没有java以及test目录
- Android 热修复之DexPatch 介绍
- MATLAB R2020a新鲜出炉,我来替各位尝尝鲜!
- 网站301重定向 解决方法
- 20岁,Universal GIS拥抱新生的GIS信创
- CentOS6.9快速安装配置svn
- c语言中的数组二分法排序程序,#C语言#二分法查找有序数组
- java 匿名初始化_Java:双括号初始化 /匿名内部类初始化法
- 全球开源正当时,第 19 届中日韩三国 IT 局长 OSS 会议暨东北亚开源软件推进论坛圆满落幕
- 苹果Mac智能照片编辑软件:​​​​Movavi Picverse
- vue filters使用
- Linux学习笔记5-linux中的磁盘
- 2020软考软件设计师--基础知识实战培训视频-任铄-专题视频课程
- LeetCode 到最近的人的最大距离
- zz 超级拖拉机 4.02 破解算法分析
- 看了它就能看懂心电图室大部分心电图
- 数据预处理-离群值检测与处理
- IBM小型机特性简介
- 贼好用的Java工具类库,GitHub星标13k+,很是厉害!
- 第9届全国大学生 GIS 技能大赛下午试题详解(下)附练习数据
热门文章
- 图文详解微信小程序如何实现微信授权登录(Java后台)下
- 【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之级联删除
- python解释器内置函数的功能_python 常用的内置函数
- Blender:使用立方体制作动漫头像
- VOC2007检测任务的评估标准
- LVM——缩小LVM分区(efx4)
- 【优化求解】基于蜉蝣算法MA(mayfly algorithm)求解单目标问题matlab源码
- 如何改变MySql数据库中 的排序_如何更改数据库的默认排序规则?
- 19KDD AccuAir Winning Solution to Air Quality Prediction for KDD Cup 2018
- 连接服务器出现黑屏怎么解决