1、单元 07 类的多态单元目标 掌握继承关系下方法的覆盖; 理解多态的含义; 掌握最终类和抽象类的概念和实现方式。学习任务任务描述公司中含有三类员工分别是雇员、行政人员和经理。由于类别不同对于三类员工分别使用类进行标示。要求雇员包含:属性有姓名和工号;行为有工作和加班。行政人员包含:属性有姓名、工号和职务;行为有工作和管理。经理包含:属性有姓名、工号、职务和部门;行为有工作和外交。使用继承技术实现公司员工的信息管理,使用多态特性通过统一的方法显示不同类型员工的信息。运行结果知识准备7.1 多态的概念多态字面意思代表“多种状态” 。前面通过对继承的讲解,父类可以被多个子类继承,那么在面向对象思想中
2、“态”是指 “子类和父类”两种状态,而一个父类可以拥有多个子类,那么子类和父类总起来就可以成为多态。例如父类记作 A,有子类 a1 和 a2。那么 A a=new a1( ); A a=new a2( );这两个语句是对的,同时 A a=new A( )。那么可以看出对于父类 A 的声明 a 它可以等于(具备)三个 new 出来的对象(状态) 。我们称这种现象为对多态。在讲解多态的正式概念前,我们还必须复习前面讲过的一个概念“重写” 。“重写” 是指父类中的方法在被子类继承过去后, 子类可以重新实现方法体内容,这样子类和父类中就存在了一个名字相同的但实现不同的方法。 假设上一段例子员工类多态程
3、序设计员工多态程序设计中父类 A 中有一个 public 权限的方法 method( ), 同时子类 a1 和 a2 对该方法进行重写。那么上段中的三个语句所产生的对象 a 分别去调用 method( )方法,结果第一句 Aa=newa1( );是调用子类 a1 中的 method( ),第二句则调用子类a2 中的 method( ),第三句则调用父类 A 的 method( )。在面向对象的程序设计中,需要利用这样的“重名”现象来提高程序的抽象度和简洁性。正式定义为:多态多态是指 Java 的运行时多态性,它是面向对象程序设计中代码重用的最强大机制,Java 实现多态的基础是动态方法调度,就
4、是指父类某个方法被其子类重写时,可以各自产生自己的功能行为。【注 意】多态概念在很多书中分为运行时多态和静态多态。 静态多态可简单理解为方法重载。实际上在程序编写时动态多态的用法更为广泛和有效。7.2 多态的用法多态的用法一般可以归结为 2 种: 一种用法是使用父类声明的数组存储子类的对象; 另一种用法是使用父类的声明作为方法的形参使用父类的声明作为方法的形参, 子类对象作为实参传入子类对象作为实参传入。【实例 7-1】员工管理系统中,员工分为普通员工(CommEmp)、管理人员(Manager)和人力资源 (HR) 。 要求 HR 对所有员工进行评测, 即打印员工的信息。父类 Employe
5、e 由普通员工和管理员工总结抽象出来。public class Employee public String name;public Employee(String name) this.name = name;public void showInfo()子类 CommEmp 继承父类 Employee,重写了父类的 showInfo 方法。public class CommEmp extends Employeepublic String workStation;public CommEmp(String name,String workStation) super(name);this.w
6、orkStation = workStation;public void showInfo()/重写父类的方法员工多态程序设计System.out.println(我是+this.name+;工作岗位是+this.workStation);子类Manager继承父类Employee,重写了父类的showInfo方法。public class Manager extends Employee public String dep;public Manager(String name,String dep) super(name);this.dep = dep;public void showInf
7、o() /重写父类的方法System.out.println(我是+this.name+;管理的部门是+this.dep);类HR的judge方法使用父类Employee(数组)作为形式参数。public class HRpublic void judge(Employee emp)/使用父类作为方法的形参for(int i=0;iemp.length;i+)empi.showInfo();/形式上调用父类方法,实际会根据传入对象来调用测试类Main中使用父类数组盛放子类对象,HR的对象调用方法传入子类对象。public class Main public static void main(S
8、tring args) Employee emp=new Employee3;/声明父类数组emp0=new CommEmp(普通员工-张三, 修理工);/数组中填充子类对象emp1=new Manager(管理者-李四, 财务处);HR hr=new HR();hr.judge(emp);员工多态程序设计员工多态程序设计员工多态程序设计任务实施1实施思路员工类、行政人员类、经理类有许多相同的语句代码。在属性方面,都包含了年龄、 性别等重复的信息定义。 换个思路, 员工是一般性的概念, 在定义类时,将经理类、行政类中相同的属性和方法抽象出来,集中放在员工类中,形成一种共享的机制,经理类、行政类
9、中只放自己特有的成员变量和成员方法,减少重复代码。这样的员工类称为父类,行政人员类、经理类称为子类。子类继承父类的非私有成员变量和成员方法。 打开 Eclipse,包中定义员工类; 在员工类中只定义共有的成员变量,定义类的构造方法,定义共有的方法; 定义行政类,经理类,只定义自己特有属性和方法,父类已有的成员变量和成员方法不再定义; 编写测试类,分别声明对象进行调用。2程序代码public class employee / 员工类/ 省略编号姓名工资/ 省略setXxx()、getXxx()public void Employee() / 构造函数ID = 0;this.name = ;thi
10、s.salary = 0.0;public void print()public class administration extends employee / 行政人员double fare;public administration() this.fare = 0.0;员工多态程序设计/ 省略getFare()、setFare(double fare)public void print()public class manager extends administration / 主管double bonus;public manager() this.bonus = 0.0;/ 省略get
11、Bonus()、setBonus(double bonus)publicvoid print()public class WorkMain public static void main(String args) employee employee1 = new employee();employee1.setID(2009);employee1.setName(zhangsan);employee1.setSalary(3500.00);System.out.println(雇员信息:);employee1.print();administration xingzheng1 = new ad
12、ministration();xingzheng1.setID(2010);xingzheng1.setName(lisi);xingzheng1.setSalary(4000.00);System.out.println(行政人员信息:);xingzheng1.print();manager manager1 = new manager();manager1.setID(2011);manager1.setName(wangwu);manager1.setSalary(6000.00);manager1.setBonus(2000.00);System.out.println(经理信息:);
13、manager1.print();任务拓展任何类的父类都是 Object,根据多态的概念,任何子类的对象都可以赋值给父类的引用。也就是说任何类的所有势力都可以用 Object 来代替。例如:Object obj=”String”;由于整数、字符型等基本数据类型不属于对象类型(引用类型) ,所以不能使用 Object 来指向这些基本数据类型。但可以通过基本数据类型的对象包装器进行转换后也可以使用 Object 来指向。例如:Object obj=new Integer(1);Object 可以代表所有的对象,这种思想对于通用编程时非常有用的。例如在 Arrays 类中有个静态方法 sort(Object obj),在这个方法中只要传入任何一个数组都可以。 由于这种通用性可以增加方法的可用范围, 使该方法具备了通用性。任务实训1.实训目的 巩固继承的概念和实现; 掌握多态的概念和实现。2.实训内容编写动物世界的继承关系代码。 动物 (Animal) 包括山羊 (Goat) 和猫 (Cat) ,它们叫声不同,山羊“咩咩” ,猫“喵喵” 。通过多态实现:创建 2 只羊,一只猫,通过循环让每只动物叫一声。员工多态程序设计