java多态的应用场景_Java开发笔记(五十一)多态的发生场景
江湖上传闻,面向对象之所以厉害,是因为它拥有封装、继承与多态三项神技,只要三板斧一出,号令天下谁敢不从。前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明多态的使用场景。
首先把鸡这种家禽通过面向对象来表达,方便起见只定义两个属性(名称和性别),以及一个call方法,定义好的鸡类代码如下所示:
//定义一个鸡类
public class Chicken {
// 定义一个名称属性
public String name;
// 定义一个性别属性
public int sex;
// 定义一个叫唤方法
public void call() {
System.out.println("半夜鸡叫");
}
}
接着从上面的Chicken类派生出公鸡类Cock,将公鸡的性别固定设置为雄性,同时重写call这个叫唤方法。公鸡类的代码示例如下:
//定义一个继承自鸡类的公鸡类
public class Cock extends Chicken {
public Cock() {
// 公鸡的性别固定为雄性
sex = 0;
}
// 重写了公鸡的叫唤方法
public void call() {
System.out.println("喔喔喔");
}
}
同样编写母鸡类Hen继承自Chicken类,将母鸡的性别固定设置为雌性,同时重写call这个叫唤方法。母鸡类的代码示例如下:
//定义一个继承自鸡类的母鸡类
public class Hen extends Chicken {
public Hen() {
// 母鸡的性别固定为雌性
sex = 1;
}
// 重写了母鸡的叫唤方法
public void call() {
System.out.println("咯咯咯");
}
}
最后在外部创建一个Chicken鸡类的实例,先将公鸡实例赋值给这个鸡类实例chicken,紧接着调用chicken的call方法;再将母鸡实例赋值给鸡类实例chicken,紧接着调用chicken的call方法。按此步骤编写的测试调用代码见下:
//演示类的多态性
public class TestChicken {
public static void main(String[] args) {
// 鸡类的实例变成了一只公鸡
Chicken chicken = new Cock();
// 此时鸡类的叫声就变为公鸡的叫声
chicken.call();
// 鸡类的实例变成了一只母鸡
chicken = new Hen();
// 此时鸡类的叫声就变为母鸡的叫声
chicken.call();
}
}
运行以上的测试代码,观察到以下的日志信息:
喔喔喔
咯咯咯
由日志结果可见,尽管chicken本来是鸡类的实例,然而两次调用chicken的call方法,却没有输出鸡类的叫声,而是先后打印了公鸡类的叫声和母鸡类的叫声。这个现象便是多态特性的一个实际运用,所谓多态,意思是有多种状态,好比古人的卸甲归田,穿上盔甲去打仗就是士兵,卸下盔甲去种田就是农民。多态的实现依赖于继承,先声明一个父类的实例,再于合适之时给它分别赋予不同的子类实例,此后操作该实例就仿佛操作子类的实例一般。
引入多态概念的好处是,只要某些类型都从同一个父类派生而来,就能在方法内部把它们当作同一种类型来处理,而无需区分具体的类型。仍以鸡叫为例,不管是公鸡叫还是母鸡叫,都是某种鸡在叫,于是完全可以定义一个叫唤方法,根据输入的鸡参数,让这只鸡自己去叫即可。叫唤方法的具体代码如下所示:
// 定义一个叫唤方法,传入什么鸡,就让什么鸡叫
private static void call(Chicken chicken) {
chicken.call();
}
这下有了通用的鸡叫方法,外部就能把鸡类的实例作为输入参数填进去。当输入参数为公鸡实例的时候,call方法上演的是公鸡喔喔叫;当输入参数为母鸡实例的时候,call方法上演的是母鸡咯咯叫。
call(new Cock()); // 公鸡叫
call(new Hen()); // 母鸡叫
java多态的应用场景_Java开发笔记(五十一)多态的发生场景相关推荐
- java度量衡换算器代码_Java开发笔记(四)Java帝国的度量衡
秦始皇统一中国之后,实行"书同文,车同轨",把货币和各种度量衡都统一起来,从而缔造了一个秩序井然的帝国.既然统一度量衡是每个帝国都要做的事情,Java帝国也不例外,对于人生地不熟的 ...
- java有常函数_Java开发笔记(十一)常见的数学函数
前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≈.求绝对值的"| |".开平方的"√ ̄", ...
- ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)
目录 ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C) 一.CryptoAuthLib 二.Nxp RT10xx平台上移植CryptoAuthLib 2.1.在官网下载最新的 ...
- java多态的应用场景_Java培训SE基础之多态的应用场景
1. 多态数组 当创建多个不同的子类对象, 而又想统一处理这批对象时, 就可以使用多态数组. Person[] arr = {new Student(), new Teacher()}; 2. 多态参 ...
- 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...
- JNI开发笔记(五)--JNI语法总结
JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...
- 【Visual C++】游戏开发笔记二十一 游戏基础物理建模 三 摩擦力系统模拟
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- Android开发笔记(十一)自定义视图的构造方法
自定义视图的用法 Android自带的视图常常不能满足实际开发的需求,这种情况下我们就得自定义视图(View). 首先在res\values目录下找到attrs.xml(如没有则创建之),在该属性定义 ...
- Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128425000 红胖子(红模仿)的博文大全:开发技术集 ...
最新文章
- 谷歌启动搜索引擎新功能 网页Flash内容即时预览
- 如何在Angular 10中生成QR码
- Word2010使用技巧之四:页眉的另类使用
- 听说你不会用datetime处理时间?
- layui tree ajax刷新,layer 刷新某个页面的实现方法
- 小学生python编程教程-围观~山东省的小学生Python编程入门都学的什么?
- 大吉大利,今晚如何用R语言解锁“吃鸡”正确姿势
- landset8各波段_landsat8卫星全面
- 一次对天翼安全网关的渗透
- uni-app思维导图
- web2.0涉及的一些技术摘要
- 比较基因组学分析(Comparative Genomics Analysis)
- 【Python入门刷题】——字符串格式化输出-大写、小写化
- 设计模式|理解单一职责原则
- 5个有效的华为(HUAWEI)手机数据恢复方法
- 探秘SLAM之RANSAC算法
- WKWebView 线程终止的原因——之 OOM 的控制逻辑
- C语言typedef的用法
- linux命令系列 alias,alias命令
- 从JVM层面来解释i++和++i的真正区别
热门文章
- C# 使用Win32 API模拟键盘鼠标操作网页
- 一、 Log4E插件下载
- windows下python虚拟环境virtualenv安装和使用(亲测)
- 浅谈Nginx服务器的内部核心架构设计
- Linux下创建用于并指定该用户的主目录和相关权限
- PHPstorm文件默认后缀
- promise异步请求串行异步then并行异步all竞争异步race 传递参数resolve(then)reject(catch)
- PHP的php://
- linux由哪些部分组成,linux内核处于什么位置?,为你介绍一些Linux操作系统的基础知识(一)...
- 谁都忍不了烂代码,如何用重构的方式让它整洁起来?