Java中的多态

1 多态是什么

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。用白话来说,就是多个对象调用同一个方法,得到不同的结果。

2 多态的语法格式

父类类名 引用名称 = new 子类类名();

当是多态时,该引用名称只能访问父类中的属性和方法,但是访问的时候,会优先访问子类重写以后的方法。

3 满足多态的条件

子类必须继承父类

子类必须重写父类的方法

父类引用指向子类对象,即:父类类名 引用名称 = new 子类类名();

4 使用多态好处

使用多态可以使代码之间的耦合度降低

减少冗余代码的同时,也使得项目的扩展能力更强

注:耦合度指的是代码(程序)之间的关联程度

5 多态中的类型转换

Java多态中,有两种类型转换:向上转型和向下转型

向上转型

向上转型,也叫做自动类型转换,子类型赋值给父类型(父类型的引用指向子类型),构成多态

父类类型 引用名称 = new 子类类名();

当使用多态方式调用方法时,该引用名称只能访问父类中的属性和方法。编译器首先检查父类中是否有该方法,如果没有,则编译错误。如果有,再去调用子类的同名(重写)方法。

向下转型

向下转型,也叫做强制类型转换,父类型赋值给子类型

当使用多态时,并且访问子类独有的属性或方法时,则必须进行向下转型

当进行向下转型时,建议先使用 instance of 关键字进行判断,判断合法时,则在转为对应的类型,否则可能会出现类型转换异常 java.lang.ClassCastException。

说明:instance of 关键字用于判断一个对象,是否属于某个指定的类或其子类的实例。

6 多态的实现方式

普通子类重写父类方法

接口

生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。

USB接口也很典型,有了这个,使得接口统一,生活更加方便

抽象类和抽象方法

7 多态简单使用案例

场景:假如有个饲养员,需要给不同的宠物喂食,下面给出使用多态和不使用多态的实现方式。

不使用多态的实现:

首先定义一个抽象类Animal、一个饲养员类AnimalKeeper、一个宠物类Dog和一个宠物类Cat。

public abstract class Animal {

public void eat() {

System.out.println("动物吃东西!");

}

}

/**

* 饲养员

*/

public class AnimalKeeper {

/**

* 给宠物猫喂食

*

* @param cat

*/

public void feed(Cat cat) {

cat.eat();

}

/**

* 给宠物狗喂食

*

* @param dog

*/

public void feed(Dog dog) {

dog.eat();

}

}

public class Dog extends Animal {

@Override

public void eat() {

System.out.println("狗啃骨头!");

}

}

public class Cat extends Animal {

@Override

public void eat() {

System.out.println("猫吃鱼!");

}

}

测试类:

public class PolymorphicTest {

public static void main(String[] args) {

//创建饲养员对象

AnimalKeeper animalKeeper = new AnimalKeeper();

//创建宠物对象

Cat cat = new Cat();

animalKeeper.feed(cat);//猫吃鱼!

Dog dog = new Dog();

animalKeeper.feed(dog);//狗啃骨头!

}

}

以上实现看起来没有什么问题,也容易理解,在目前情况下,饲养员可以满足喂养宠物的需求。但是,过了一周,饲养员又喂养了一只鸟,这时候不得不修改AnimalKeeper类,使其可以饲养宠物鸟,不仅违反了Java中的开闭原则,而且以上代码的实现,扩展性极差。

使用多态的实现:

只需要对以上代码中,饲养员类AnimalKeeper进行替换,新增一个饲养员类AnimalKeeperPolymorphic类。

/**

* 饲养员

*/

public class AnimalKeeperPolymorphic {

/**

* 饲养员给宠物喂食

*

* @param animal

*/

public void feed(Animal animal) {

animal.eat();

}

}

测试用例:

public static void change() {

//创建饲养员对象

AnimalKeeperPolymorphic animalKeeper = new AnimalKeeperPolymorphic();

//创建宠物对象

Cat cat = new Cat();

animalKeeper.feed(cat);//猫吃鱼!

Dog dog = new Dog();

animalKeeper.feed(dog);//狗啃骨头!

}

这种实现有什么好处呢,当新需求来了,需要扩展时,不需要修改饲养员的代码。比如说刚才那个需求,新增加一个宠物鸟,只需要新建一个宠物鸟类,实现Animal接口,不仅遵循了OCP原则,也可以实现饲养宠物鸟的功能。

8 多态分析

以上文中示例代码进行分析,看看多态是如何使用的。

AnimalKeeperPolymorphic中的feed()方法,使用了多态。

当饲养员喂养宠物狗时,其实执行的是:

Animal animal = new Dog();

当饲养员喂养宠物猫时,其实执行的是:

Animal animal = new Cat();

这种属于向上转型,里面有继承(cat继承Animal)关系,重写了父类eat()方法,子类型赋值给父类型(父类型的引用指向子类型),构成了多态。

Animal animal = new Cat(); 程序在编译阶段,animal引用类型被编译器看做Animal类型,所以程序在编译阶段,animal引用绑定的是Aninmal类中的eat()方法,这个过程叫做Java多态的静态绑定。

程序在运行的时候,堆中的对象实际上是Cat类型,而Cat对象已经覆盖(重写)了父类Animal的eat()方法,所以程序在运行阶段,对象绑定的方法是Cat中的eat()方法,这个过程叫做Java多态的动态绑定。

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!

java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...相关推荐

  1. java多态 降低代码耦合性_如何降低耦合度

    一.什么是耦合度 耦合度就是某模块(类)与其它模块(类)之间的关联.感知和依赖的程度,是衡量代码独立性的一个指标,也是软件工程设计及编码质量评价的一个标准.耦合的强度依赖于以下几个因素:(1)一个模块 ...

  2. java加载并运行虚拟机_《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?...

    Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...

  3. 21 利用分布式消息队列降低系统耦合性

    国内某大型互联网企业经常因为对同行的产品进行微创新,然后推岀自己的产品而遭人诟病,不讨论这种做法是否合适,我们分析这些产品,发现大多数都比原创产品有 更好的用户体验.这些产品常常后来居上,更速度地推岀 ...

  4. 深度学习深度前馈网络_深度学习前馈网络中的讲义第4部分

    深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...

  5. java中接口降低耦合性_如何降低一个程序的耦合性

    耦合性是程序结构中各个模块之间相互关联的度量.它取决于各个模块之间接口的复杂程度.调用模块的方式以及哪些信息通过接口. 一般模块之间可能的连接方式有七种,构成耦合性的七种类型.它们之间的关系为(由弱到 ...

  6. java 耦合性_软件工程中的耦合性和解耦合性是什么意思?

    我也来通俗地讲一讲,说的不好请勿喷. 简单概括:耦合就是程序中的一部分跟其他部分之间的关系.解耦合就是把必要的耦合理顺,同时尽量减少不必要的耦合(这一句其实就是高内聚低耦合的通俗解释). 如何看待耦合 ...

  7. java 快速生成有残午餐_写出优质Java代码的4个技巧

    译者注:如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧.以下为译文. 本文我们将介绍一些有助 ...

  8. c++代码健壮性_复活Navex-使用图查询进行代码分析(上)

    从了解到修复 Navex, 其中花了一年多, 从对自动化代码审计一无所知到学习PL/Static Analysis, 翻阅十几年前的文档, 补全Gremlin Step, 理解AST, CFG, DD ...

  9. java 用程序代码解释继承_关于初级java程序员笔试题

    关于初级java程序员笔试题 Sun 认证Java程序员考试内容涉及Java所有相关知识.编程概念及applet开发技巧.下面是小编整理的关于初级java程序员笔试题,欢迎大家参考! 第一题:判断题 ...

最新文章

  1. R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型,配置自定义的损失函数评估函数并使用交叉验证训练xgboost模型
  2. centos6.4安装apache php mysql_CentOS6.4下apache+php的简易搭建
  3. Eigen 模板库的简介
  4. MySQL下载以及安装【windows】
  5. 聊聊微服务的隔离和熔断
  6. 图解JavaScript原型链继承
  7. 基带模型下基于高阶累积量的MFSK信号的调制识别(代码和参考文献见CSDN同名资源)
  8. 微擎模块安装文件manifest.xml
  9. IOS学习笔记05---C语言程序的开发运行过程
  10. java 取消引用_java代码优化——消除过期的对象引用
  11. 树莓派android p,Android P最新测试版带来更多的UI和图标方面的改进
  12. python qq群文件_Python随笔|抓取QQ群成员头像
  13. 内连接、外连接和全连接的区别
  14. Xen虚拟化环境安装和常用命令
  15. 门禁管理系统服务器,门禁控制软件 门禁管理系统
  16. 宁静以致远——浅析《临江仙.滚滚长江东逝水》
  17. 微信红包雨怎么抢_微信里的红包雨怎么下?微信里的红包雨如何设置?
  18. word默认文字环绕方式是什么_在Word 2010文档中设置图片文字环绕方式
  19. 华为路由器路由表解析
  20. jQuery-入口函数

热门文章

  1. 添加背景音乐(解决苹果手机不能自动播放问题)
  2. JavaScript基础(三)流程控制
  3. Spring Actuator源码分析(转)
  4. 超好用的推广引流方法,看完赶紧用!
  5. MySQL性能优化的21条最佳经验
  6. java 加密算法 base64
  7. 跟小静读CLR via C#(02)-基元类型、引用类型、值类型
  8. java键盘输入运算符_Java基础学习-三元运算符和键盘录入的基本步骤和使用
  9. python os 获取当前路径的绝对路径的上层目录_os 模块常用函数
  10. android模糊查询listview数据_ListView的简单应用(一)