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编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≍.求绝对值的“| |”.开平方的“√ ̄”,这些运算符形态各异,而且并非ASCII码 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
- Java开发笔记(一百五十一)Druid连接池的用法
C3P0连接池自诞生以来在Java Web领域反响甚好,业已成为hibenate框架推荐的连接池.谁知人红是非多,C3P0在大型应用场合中暴露了越来越多的局限性,包括但不限于下列几点:1.C3P0管理 ...
- Java开发笔记(五十三)关键字final的用法
前面介绍了多态的相关用法,可以看到一个子类从父类继承之后,便能假借父类的名义到处晃悠.这种机制在正常情况之下没啥问题,但有时为了预防意外发生,往往只接受当事人来处理,不希望它的儿子乃至孙子来瞎掺和.可 ...
- Java开发笔记(八十五)通过字符流读写文件
前面介绍了文件的信息获取.管理操作,以及目录下的文件遍历,那么文件内部数据又是怎样读写的呢?这正是本文所要阐述的内容.File工具固然强大,但它并不能直接读写文件,而要借助于其它工具方能开展读写操作. ...
- Java开发笔记(八十一)如何使用系统自带的注解
之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...
- Java开发笔记(四十五)成员属性与成员方法
前面介绍了许多数据类型,除了基本类型如整型int.双精度型double.布尔型boolean之外,还有高级一些的如包装整型Integer.字符串类型String.本地日期类型LocalDate等等,那 ...
- Java开发笔记(六十五)集合:HashSet和TreeSet
对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...
- Java开发笔记(七十五)异常的处理:扔出与捕捉
前面介绍的几种异常(不包含错误),编码的时候没认真看还发现不了,直到程序运行到特定的代码跑不下去了,程序员才会恍然大悟:原来这里的代码逻辑有问题.像这些在运行的时候才暴露出来的异常,又被称作“运行时异 ...
随机推荐
- vim 常用指令
其他命令 <c-L> 重绘屏幕 <c-z> 挂起vim回到shell,想继续vim只需要输入 fg <c-x-f> 文件路径提示 <c-N> 当前文件中 ...
- python爬虫第五天
cookie 我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态 ...
- JSON File Parse
1.write a json file base on website(在网站上写一个json文件) json文件网址:https://raw.githubusercontent.com/DJOSIM ...
- Mesos源码分析(13): MesosContainerier运行一个Task
MesosContainerizer的实现在文件src/slave/containerizer/mesos/containerizer.cpp中 Future<bool> MesosC ...
- Python 爬虫入门(二)——爬取妹子图
Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...
- [Swift]LeetCode58. 最后一个单词的长度 | Length of Last Word
Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...
- [Swift]LeetCode1004. 最大连续1的个数 III | Max Consecutive Ones III
Given an array A of 0s and 1s, we may change up to K values from 0 to 1. Return the length of the lo ...
- 接口平台经常报server internal error(500)错误
查询日志,发现连接mysql报错,web页面显示server internal error(500) 解决方法:重启mysql服务器 systemctl start mysqld #安装mysql # ...
- 一张图看懂STM32芯片型号的命名规则
意法半导体已经推出STM32基本型系列.增强型系列.USB基本型系列.增强型系列:新系列产品沿用增强型系列的72MHz处理频率.内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM.新 ...
- webstorm 支持vue element-ui 语法高亮属性自动补全
如果webstorm中 提示 Unknown html tag el-*** 说明没有加载 node_modules 下的 element-ui 解决办法就是: 在webstorm 打开的状态下 第一 ...