Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态
一:什么是多态;
多态是同一个行为具有多个不同表现形式或形态的能力.
多态就是同一个接口,使用不同的实例而执行不同操作.
多态性是对象多种表现形式的体现。
现实中,比如我们按下 F1 键这个动作:
- 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
- 如果当前在 Word 下弹出的就是 Word 帮助;
- 在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
二:多态的优点;
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
三:多态存在的三个必要条件;
- 继承
- 重写
- 父类引用指向子类对象
比如:
Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
以下是一个多态实例的演示,详细说明请看注释:
Test.java 文件代码:
public class Test {public static void main(String[] args) {show(new Cat()); // 以 Cat 对象调用 show 方法show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eatCat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work } public static void show(Animal a) {a.eat(); // 类型判断if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } }abstract class Animal { abstract void eat(); } class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); } } class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); } }
运行结果为:
吃鱼 抓老鼠 吃骨头 看家 吃鱼 抓老鼠
四:虚方法;
我们将介绍在Java中,当设计类时,被重写的方法的行为怎样影响多态性。
我们已经讨论了方法的重写,也就是子类能够重写父类的方法。
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
要想调用父类中被重写的方法,则必须使用关键字super。
Employee.java 文件代码:
public class Employee {private String name;private String address;private int number;public Employee(String name, String address, int number) {System.out.println("Employee 构造函数");this.name = name;this.address = address;this.number = number;}public void mailCheck() {System.out.println("邮寄支票给: " + this.name+ " " + this.address);}public String toString() {return name + " " + address + " " + number;}public String getName() {return name;}public String getAddress() {return address;}public void setAddress(String newAddress) {address = newAddress;}public int getNumber() {return number;} }
假设下面的类继承Employee类:
Salary.java 文件代码:
public class Salary extends Employee {private double salary; // 全年工资public Salary(String name, String address, int number, double salary) {super(name, address, number);setSalary(salary);}public void mailCheck() {System.out.println("Salary 类的 mailCheck 方法 ");System.out.println("邮寄支票给:" + getName()+ " ,工资为:" + salary);}public double getSalary() {return salary;}public void setSalary(double newSalary) {if(newSalary >= 0.0) {salary = newSalary;}}public double computePay() {System.out.println("计算工资,付给:" + getName());return salary/52;} }
现在我们仔细阅读下面的代码,尝试给出它的输出结果:
VirtualDemo.java 文件代码:
public class VirtualDemo {public static void main(String [] args) {Salary s = new Salary("员工 A", "北京", 3, 3600.00);Employee e = new Salary("员工 B", "上海", 2, 2400.00);System.out.println("使用 Salary 的引用调用 mailCheck -- ");s.mailCheck();System.out.println("\n使用 Employee 的引用调用 mailCheck--");e.mailCheck();} }
以上实例编译运行结果如下:
Employee 构造函数 Employee 构造函数 使用 Salary 的引用调用 mailCheck -- Salary 类的 mailCheck 方法 邮寄支票给:员工 A ,工资为:3600.0 使用 Employee 的引用调用 mailCheck-- Salary 类的 mailCheck 方法 邮寄支票给:员工 B ,工资为:2400.0
例子解析
实例中,实例化了两个 Salary 对象:一个使用 Salary 引用 s,另一个使用 Employee 引用 e。
当调用 s.mailCheck() 时,编译器在编译时会在 Salary 类中找到 mailCheck(),执行过程 JVM 就调用 Salary 类的 mailCheck()。
因为 e 是 Employee 的引用,所以调用 e 的 mailCheck() 方法时,编译器会去 Employee 类查找 mailCheck() 方法 。
在编译的时候,编译器使用 Employee 类中的 mailCheck() 方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是 Salary 类中的 mailCheck() 方法。
以上整个过程被称为虚拟方法调用,该方法被称为虚拟方法。
Java中所有的方法都能以这种方式表现,因此,重写的方法能在运行时调用,不管编译的时候源代码中引用变量是什么数据类型。
五:多态的实现方式;
方式一:重写:
方式二:接口
1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
方式三:抽象类和抽象方法
转载于:https://www.cnblogs.com/pureqh/p/9165085.html
Java学习笔记二十五:Java面向对象的三大特性之多态相关推荐
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇
二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...
- java沙盒模式_JavaScript学习笔记(二十五) 沙箱模式
沙箱模式(Sandbox Pattern) 沙箱模式可以避免命名空间的一些缺点(namespacing pattern),比如: 依赖一个唯一全局的变量作为程序的全局符号.在命名空间模式中,没有办法存 ...
- Java学习笔记二十二:Java的方法重写
Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- 【Java学习笔记之十五】Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- JAVA学习笔记(二十)- 集合 List
ArrayList 集合 /** ArrayList,实现List接口* 声明数组时必须指定数组中元素的类型,可以是基本数据类型,也可以是引用数据类型* 声明集合时可以不指定其元素的类型,元素类型默认 ...
- 【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题
foreach语句使用总结 增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量,这个局部变量的类型与part2中的对 ...
- angular学习笔记(二十五)-$http(3)-转换请求和响应格式
本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({transfor ...
最新文章
- 2021年春季学期-信号与系统-第四次作业参考答案-第五小题
- 也谈.Net中间语言——破解Delphi2CS行数和时间限制
- Windows7部署WordPress傻瓜式教程-cnblogs
- python安装matplotlib需要c编译_新安装matplotlib时缺少cbook
- 如何在GitHub上发现优秀的开源项目
- 数据结构猴子选大王java_数据结构例子-猴子选大王
- 使用Prometheus监控Flink
- 简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
- JAVA类集浅谈之一
- SQLyog 安装和配置教程
- 德标螺纹规格对照表_常用螺栓的标准和规格表
- 【算法集训 | 暑期刷题营】7.19题---回溯与剪枝
- 全面详解互联网企业开放API的 “守护神”
- codeup 1006
- FBReader阅读引擎支持的功能
- 机器学习——决策树算法之代码+数学实例解析
- 作为技术人员,我是如何安排学习的
- 7-1 图的先深搜索+7-2 图的先广搜索
- 简单聊一聊Python工程师任职要求及未来发展方向
- R语言笔记——”org.Hs.eg.db“脱坑记录
热门文章
- CUDA Samples: approximate image reverse
- Linux下遍历文件夹的实现
- 【Linux驱动】ThinkPad笔记本wifi模块rtl8821ce在ubuntu16.04的驱动(默认没有)
- python爬取电影评分_用Python爬取猫眼上的top100评分电影
- oracle取非空,求一条sql,返回分组后,空值取最近一条非空值,非空值取本身
- 联机分析处理系统与联机事务处理系统的区别和联系_混合事务分析处理“HTAP”的技术要点分析...
- golang bufio.newscanner如何超时跳出_Golang微服务的熔断与限流
- Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
- 测试打桩_DNF:CEO实测旭旭宝宝红眼,打桩高达2494E,伤害超越狂人剑魂
- 【转载】xmind的使用安装方法