Java向下转型的意义详解
基础知识多肽回顾:
1.多肽是方法的多肽,不是属性的多肽(多肽与属性无关)。
2.多肽的存在有三个必要条件:继承、方法重写、父类引用指向子类对象。
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多肽就出现了。
详细举例:
这里有继承,有方法重写,但是缺少父类引用指向子类对象。
class AllAnimal{public void speak(){System.out.println("我们都是动物");}
}class Cat extends AllAnimal{ public void speak(){System.out.println("我是猫");}
}class Fish extends AllAnimal{public void speak(){System.out.println("我是鱼");} public void canDo(){System.out.println("我会游泳");}
}
这样就产生了多肽:父类引用指向子类对象(也是自动向上转型)。
public static void main(String[] args){AllAnimal a=new Cat();a.speak(); //我是猫}
下面正式讨论向下转型和向上转型:
自动向上转型示例:
//自动向上转型
AllAnimal a=new Fish();
a.speak(); //我是鱼
分析:这里从编译器的角度,首先你要知道编译器是个"笨蛋"!它就认为a就是AllAnimal,它首先会去AllAnimal类中找到speak()方法,发现有这个方法,则编译通过。(实际上a是指向的子类Fish)
向上转型的缺陷:
AllAnimal a=new Fish();
a.canDo();//报错
按照上面所说编译器认为a就是AllAnimal,那么首先会去AllAnimal中找canDo()方法,但是没有找打,这个方法是子类增加的新方法,编译则不通过。
牢牢记住一句话:无论向上向下转型,编译看左边,运行看右边。
意思就是:编译时候左边的对象有没有该方法(不严谨),运行时候看new的对象是谁,就调用谁的方法
为了解决上述问题,引入强制向下转型:
AllAnimal a=new Fish();
a.speak();
//强制向下转型
Fish a1=(Fish)a;
a1.canDo();
由此得到向下转型的意义:父类引用可以使用子类的新增方法了。
Java向下转型的意义详解相关推荐
- java的向下转型_浅谈Java向下转型的意义
一开始学习 Java 时不重视向下转型.一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型. 其实向上转型和向下转型都是很重要的,可能我们平时见向上转型多一点,向 ...
- Java向下转型的意义
Java向下转型的意义 一开始学习 Java 时不重视向下转型.一直搞不清楚向下转型的意义和用途,不清楚其实就是不会,那开发的过程肯定也想不到用向下转型. 其实向上转型和向下转型都是很重要的,可能我们 ...
- java 委托机制_通过反射实现Java下的委托机制代码详解
简述 一直对Java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块API public Class Delegater()//空参构造,该类管理委托实例并 ...
- java委托机制教程_通过反射实现Java下的委托机制代码详解
简述 一直对java没有现成的委托机制耿耿于怀,所幸最近有点时间,用反射写了一个简单的委托模块,以供参考. 模块api public class delegater()//空参构造,该类管理委托实例并 ...
- Java接口,多态,向上转型,向下转型的意义
接口 官方解释: Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现 ,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 包含 ...
- Java中向下转型的意义
什么是向上转型和向下转型 在Java继承体系中,认为基类(父类/超类)在上层,导出类(子类/继承类/派生类)在下层,因此向上转型的意思就是把子类对象转成父类类型,即将父类的引用指向子类对象:向下转型的 ...
- java集合框架史上最详解(list set 以及map)
title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...
- 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?
Java IO概述 IO就是输入/输出.Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题.我们把数 ...
- Java内存模型(JMM)详解-可见性volatile
这里写自定义目录标题 Java内存模型(JMM)详解-可见性 什么是JMM JMM存在的意义 为什么示例demo中不会打印 i 的值 如何解决可见性问题 **深入理解JMM内存模型** JAVA内存模 ...
最新文章
- C++知识点21——使用C++标准库(再谈string——string的搜索和数值转化)
- 面试书上一些题目的整理:O(n)复杂度排序年龄 青蛙跳台阶
- 超越ImageNet预训练,Meta AI提出SplitMask,小数据集也能自监督预训练
- Qt Creator创建组件
- MySQL(三)MySQL索引原理
- tshark 小技巧
- BCGControlBar入门使用手册
- 管理者和领导者的区别_见到一个领导者时如何识别
- Oracle中ascii为0的陷阱
- xcode cocos2dx 3.x mac工程 当assert(cond)触发断点,但cond却为0
- css span 右端对齐_使用 CSS 实现具有方面感知的幽灵按钮
- verilog实现多周期处理器之——(五)移动操作(通用数据传送)指令的实现
- 闲话目前游戏服务器的开发
- java 解析unicode,解析Unicode编码和Java char
- windows邮件绑定谷歌邮箱
- ul阻燃标准有几个等级_塑料制品中的UL 阻燃等级防火等级划分标准
- 【解决】Outlook无法正常显示邮件中的图片
- 深度详解新iPad八核GPU
- light7ui 刷新子页面 js不能加载的问题
- 【b站黑马程序员C++视频学习笔记-继承方式】
热门文章
- 【安卓逆向】cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037: 由于目标计算机积极拒绝,无法连接。 (100
- 编程案例——layui的table表格并获取选中的数据、layui监控select下拉框并将隐藏的div显示
- 一些点心那种惬意的生活态度
- 对比几款目前流行的 Linux 发行版
- html图片自适应div
- MyBatis-Plus——字段类型处理器TypeHandler
- 《思考,快与慢》 读书笔记
- 5分钟,客服聊天处理技巧,炉火纯青
- CryptoJS实现vue项目路由传参AES加密
- MySQL数据库实现本地数据库和远程服务器数据库数据同步