江湖上传闻,面向对象之所以厉害,是因为它拥有封装、继承与多态三项神技,只要三板斧一出,号令天下谁敢不从。前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明多态的使用场景。

首先把鸡这种家禽通过面向对象来表达,方便起见只定义两个属性(名称和性别),以及一个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开发笔记(五十一)多态的发生场景相关推荐

  1. java度量衡换算器代码_Java开发笔记(四)Java帝国的度量衡

    秦始皇统一中国之后,实行"书同文,车同轨",把货币和各种度量衡都统一起来,从而缔造了一个秩序井然的帝国.既然统一度量衡是每个帝国都要做的事情,Java帝国也不例外,对于人生地不熟的 ...

  2. java有常函数_Java开发笔记(十一)常见的数学函数

    前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≈.求绝对值的"| |".开平方的"√ ̄", ...

  3. ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)

    目录 ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C) 一.CryptoAuthLib 二.Nxp RT10xx平台上移植CryptoAuthLib 2.1.在官网下载最新的 ...

  4. java多态的应用场景_Java培训SE基础之多态的应用场景

    1. 多态数组 当创建多个不同的子类对象, 而又想统一处理这批对象时, 就可以使用多态数组. Person[] arr = {new Student(), new Teacher()}; 2. 多态参 ...

  5. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...

  6. JNI开发笔记(五)--JNI语法总结

    JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...

  7. 【Visual C++】游戏开发笔记二十一 游戏基础物理建模 三 摩擦力系统模拟

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  8. Android开发笔记(十一)自定义视图的构造方法

    自定义视图的用法 Android自带的视图常常不能满足实际开发的需求,这种情况下我们就得自定义视图(View). 首先在res\values目录下找到attrs.xml(如没有则创建之),在该属性定义 ...

  9. Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128425000 红胖子(红模仿)的博文大全:开发技术集 ...

最新文章

  1. 谷歌启动搜索引擎新功能 网页Flash内容即时预览
  2. 如何在Angular 10中生成QR码
  3. Word2010使用技巧之四:页眉的另类使用
  4. 听说你不会用datetime处理时间?
  5. layui tree ajax刷新,layer 刷新某个页面的实现方法
  6. 小学生python编程教程-围观~山东省的小学生Python编程入门都学的什么?
  7. 大吉大利,今晚如何用R语言解锁“吃鸡”正确姿势
  8. landset8各波段_landsat8卫星全面
  9. 一次对天翼安全网关的渗透
  10. uni-app思维导图
  11. web2.0涉及的一些技术摘要
  12. 比较基因组学分析(Comparative Genomics Analysis)
  13. 【Python入门刷题】——字符串格式化输出-大写、小写化
  14. 设计模式|理解单一职责原则
  15. 5个有效的华为(HUAWEI)手机数据恢复方法
  16. 探秘SLAM之RANSAC算法
  17. WKWebView 线程终止的原因——之 OOM 的控制逻辑
  18. C语言typedef的用法
  19. linux命令系列 alias,alias命令
  20. 从JVM层面来解释i++和++i的真正区别

热门文章

  1. C# 使用Win32 API模拟键盘鼠标操作网页
  2. 一、 Log4E插件下载
  3. windows下python虚拟环境virtualenv安装和使用(亲测)
  4. 浅谈Nginx服务器的内部核心架构设计
  5. Linux下创建用于并指定该用户的主目录和相关权限
  6. PHPstorm文件默认后缀
  7. promise异步请求串行异步then并行异步all竞争异步race 传递参数resolve(then)reject(catch)
  8. PHP的php://
  9. linux由哪些部分组成,linux内核处于什么位置?,为你介绍一些Linux操作系统的基础知识(一)...
  10. 谁都忍不了烂代码,如何用重构的方式让它整洁起来?