第四章 面向对象-多态
什么是多态
- 如何实现多态
- 多态的好处
- instanceOf关键字
- 多态时的注意事项
学习目标:
- 什么是多态?
- 如何实现多态?
- 多态带来的好处?
- instanceOf关键字的用法
什么是多态
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是面向对象最后一个概念,也是最重要的知识点。
多态的定义:
指允许不同类的对象对同一消息做出响应。即同一消息可以根据调用对象的不同
而采用多种不同的行为方式。
- 比方说按下 F1 键这个动作,如果当前在Word下弹出的就是Word帮助;在Windows下弹出的就是Windows帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
如何实现多态
多态存在的三个必要条件
1. 要有继承;
2. 要有重写;
3. 父类引用指向子类对象。向上转型
多态的好处
- 可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- 可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
- 接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的 。
- 灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
instanceOf关键字
- instanceof是Java的一个二元操作符,和==,>,<是同一类。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据
- java 中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
- 用法:
实例对象 instanceof 某个类名
例子
1. //使用多态来创建了一只猫
2. Animal cat = new Cat();
3. //判断猫是否是一个动物
4. if(cat instanceof Animal)
5. {
6. System.out.println(“猫是一只动物”);
7. }
- 在判断父类的引用指向了子类的实例时,我们可以进行强制类型转换。
1. Animal anim = new Cat();
2. if(anim instanceof Animal)
3. {
4. //强制类型转换,向下转型
5. Cat cat = (Cat)anim;
6. }
当对不具有相同类型的对象进行强制类型转换时,java运行时将抛出java.lang.ClassCastException的错误。
多态时的注意事项
//左边 右边
Animal c = new Cat();
1.编译器看左边:在编译的时候编译器不管你右边是什么类,只要左边的Animal类能编译通过就不会报错。在编译器去调用方法时,所有方法必须在Animal中声明过,否则找不到方法,编译失败
2.运行期看右边:实际调用过程中,系统会根据你右边是否有该方法,而去执行,如果没有,则执行左边的父类的方法。
学员作业
- 定义商品类及其多层的派生类。以商品类为基类。第一层派生出服装类、家电类、车辆类。
第二层派生出衬衣类、外衣类、帽子类、鞋子类;空调类、电视类、音响类;自行车类、轿车类、摩托车类。要求给出基本属性和派生过程中增加的属性 - 几何形体的派生关系如下对平面形体有长和面积,对立体有表面积和体积,对 几何图形基类,周长、面积和体积应怎样计算(用什么函数)?对平面图形体积怎样计算(用什么函数)?对立体图形周长怎么计算(用什么函数)?要求实现多态性。
- 编写一个程序实现小型公司的工资管理。该公司主要有4类人员:经理(mainager)、技术人员(technician)、销售员(salesman)、销售经理(salesmanager)。这些人员是职员(employee),有编号、姓名、月工资信息。月工资的计算方法是:经理固定月薪8000元,技术人员每小时100元,销售员按当月销售额4%提成,销售经理既拿固定月工资5000元也拿销售提成,销售提成为所管辖部门当月销售额的5‰。要求编程计算职员的月工资并显示全部信息。