Java面向对象精品教程教案:4.方法重写与多态

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
法不能被子类覆盖为静态方法 子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的
静态方法(注:静态方法中无法使用super) 父类的私有方法不能被子类覆盖 不能抛出比父类方法更多的异常
演示示例1:方法重写的规则
5/29
方法重写vs方法重载
比较项
方法重写 方法重载
位置 子类 同类
方法名 相同 相同
pet.toHospital();
}}
… … 测试方法
4Fra Baidu bibliotek
Pet pet = new Dog();
Master master = new Master();
master.cure(pet);
父类引用、子类对象
……
15/29
多态的使用-2
又要给XXX看病时,只需
编写XXX类继承Pet类(旧方案也需要) 创建XXX类对象(旧方案也需要) 其他代码不变(不用修改Master类)
演示示例2:重写equals()
10/29
练习2:重写equals()
需求说明
重写比较规则,判断两名学员(Student)是否为同一 对象
Student相关属性
Id(学号)、name(姓名)、age(年龄)
如果两名学员的学号以及姓名相同,则为同一对象
instanceof用于判断一个引用类型所引用的对象是否是一个类的实例
Dog类 public class Dog extends Pet {
1
public void toHospital() {
this.setHealth(60); System.out.println("打针、吃药");
}}
Penguin类
public class Penguin extends Pet {
修改主人类,添加给XXX看病的方法
频繁修改代码,代码可扩展性、可维护性差 使用多态优化
13/29
什么是多态
生活中的多态
不同类型的打印机打印效果不同
打印
黑白打印机
彩色打印机
同一种事物,由于条件不同,产生的结果也不同
多态:同一个引用类型,使用不同的实例而执行不同操作
14/29
多态的使用-1
使用多态优化后的代码
抽象方法
问题 以下代码有什么问题?
public abstract class Pet { public void toHospital() { }
}
每个子类的实现不同
抽象方法 public abstract void print();
抽象方法没有方法体 抽象方法必须在抽象类里 抽象方法必须在子类中被实现,除非子类是抽象类
参数表 相同
返回值
相同或是 其子类
访问修饰 符
不能比父 类更严格
不相同
无关
无关
6/29
练习1:使用重写优化电子宠物系统 需求说明
使用方法重写优化电子宠物系统,实现如下效果
7/29
Object类 Object类是所有类的父类
public class Pet extends Object { ……
} }
//给企鹅看病 public void cure(Penguin penguin){
if (penguin.getHealth() < 50) { penguin.setHealth(70); System.out.println("吃药、疗养");
} }
12/29
为什么使用多态 分析 添加XXX类,继承Pet类
9/29
Object类
Object类的equals()方法
比较两个对象是否是同一个对象,是则返回true 操作符==
简单数据类型,直接比较值。如1==2 引用类型,比较两者是否为同一对象
(1)Object类的equals()方法与==没区别 (2)当有特殊需求,如认为属性相同即为同一对象时,需要重写equals() (3)Java.lang.String重写了equals()方法,把equals()方法的判断变为了判断其值
2
public void toHospital() {
this.setHealth(70); System.out.println("吃药、疗养");
}}
主人类
public class Master {
3
public void cure(Pet pet) {
if (pet.getHealth() < 50)
}
8/29
Object类
Object类被子类经常重写的方法
方法
toString()
说明
返回当前对象本身的有关信息,按字符串对象返回
equals()
比较两个对象是否是同一个对象,是则返回true
hashCode() 返回该对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回Class对象
如何实现如下效果呢?
子类重写父类方法
3/29
什么是方法重写 方法的重写或方法的覆盖(overriding)
子类根据需求对从父类继承的方法进行重新编写 重写时,可以用super.方法的方式来保留父类的方法 构造方法不能被重写
4/29
方法重写规则
方法名相同 参数列表相同 返回值类型相同或者是其子类 访问权限不能严于父类 父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方
方法重写是实现多态的基础
演示示例3:使用多态为宠物看病
16/29
多态的使用-3 问题 Pet类的toHospital()如何实现呢?
toHospital()不需要有具体的实现 抽象方法 Pet类声明为抽象类 实例化Pet毫无意义
public abstract class Pet { }
17/29
11/29
为什么使用多态
如下主人类中给宠物看病的方法,如果又需要给
问题
XXX宠物看病,怎么办?
//给狗看病 public void cure(Dog dog) {
if (dog.getHealth() < 50) { dog.setHealth(60); System.out.println("打针、吃药");
方法重写与多态
本课目标
学完本次课程后,你能够:
实现方法重写 深入理解继承相关概念 了解Object类 会使用重写实现多态机制 会使用instanceof运算符 会使用向上转型 会使用向下转型
2/29
为什么要学习方法重写
回顾继承实现的电子宠物系统……
调用父类的print()方法,不能显 示Dog的strain信息和Peguin 的sex信息
相关文档
最新文档