




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 动物类派生 继承与多态,能力目标: 理解类的继承,能编写类及其派生子类。 理解多态含义,理解上转型对象,能在子类中重写父类的同名方法。 能运用继承与多态编写人类派生学生类、动物类派生马类等程序。,内容介绍,8.1 任务预览 8.2 继承与派生 8.3 用protected声明受保护成员 8.4 关键字super 8.5 类类型变量赋值 8.6 多态性 8.7 本章小结 8.8 实训8:人类派生与动物类派生,8.1 任务预览,本章实训程序运行结果:,8.2 继承与派生,计算机世界与自然界一样,类之间也有继承和派生关系。 运用继承与派生能达到代码重用、简化编程的目的。语法: public abstract final class 子类名 extends 父类 . 类的单一继承关系形成了清晰的层次结构,树状图如下:,【例8-1】编写人类。再编写继承人类的学生类,学生类还拥有学号字段和学习方法。构造人类和学生类的对象,输出有关信息。,class Human1 /人类 protected String name; protected char sex; protected int age; public Human1(String name, char sex, int age) = name; this.sex = sex; this.age = age; public void think() /思考方法 System.out.println(name + “在思考.“); ,class Pupil1 extends Human1 /继承人类的学生类 protected String stuNo; /学号 public Pupil1(String stuNo, String name, char sex, int age) super(name, sex, age); this.stuNo = stuNo; public void learn( ) /学习方法 ,public class Example1 public static void main(String args) Human1 person = new Human1(“林冲“, 男, 30); person.think(); System.out.println(); Pupil1 aPupil = new Pupil1(“001“, “李明“, 男, 6); aPupil.think(); aPupil.learn(); ,8.3 用protected声明受保护成员,关键字protected可修饰类的字段和方法,这些成员能被所有派生子类直接或间接继承。 protected修饰的类成员,还能被类所在的包访问。 在例8-1中,使用了关键字protected修饰人类Human1的name、sex和age字段。 虽然protected可以修饰字段,但类的封装性要求除了final常量字段外,其它字段一律应为private。故不可滥用protected修饰字段。,【例8-2】按照类封装性要求改写例8-1,以保证字段为private。,class Human2 private String name; private char sex; private int age; public Human2(String name, char sex, int age) protected String getName() public void think() ,class Pupil2 extends Human2 private String stuNo; public Pupil2() public void learn( ) public class Example2 public static void main(String args) Human2 person = new Human2(“林冲“, 男, 30); person.think(); Pupil2 aPupil = new Pupil2(“001“, “李明“, 男, 6); aPupil.think(); aPupil.learn(); ,8.4 关键字super 8.4.1 用super调用父类构造方法,类如果没有显式声明构造方法,则自动生成无参数的默认构造方法。 子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。 【例8-3】编程,验证执行子类构造方法会自动调用父类的构造方法。 class Human3 public Human3() System.out.println(“构造了一个人“); ,class Pupil3 extends Human3 public Pupil3() /super(); /相当于执行了本语句 System.out.println(“构造了一个学生“); public class Example3 public static void main(String args) Pupil3 pupil = new Pupil3(); Student,8.4.2 用super访问父类字段和方法,除了调用父类构造方法外,super还可在子类中指代父类对象,用于: 访问被子类隐藏的父类字段, 调用被子类覆盖的父类方法。 使用形式: super.父类字段名 super.父类方法名(可选实参表),1、成员的隐藏,对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量;子类自己声明定义的方法与父类方法同名是指子类重新声明定义的这个成员方法。,2、子类通过重写可以隐藏已继承的实例方法。 1重写的语法规则 如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。 方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。 2重写的目的 子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。Bank,8.5 类类型变量赋值 8.5.1 子类对象的上转型对象,子类由父类派生,可把子类对象赋给父类声明的变量。如: Human human = new Pupil(); 或者: Human human; Pupil pupil = new Pupil(); human = pupil;,这种由父类变量引用的子类对象就是上转型对象。特征: (1)上转型对象不能操作子类新增的成员字段和成员方法。 (2)上转型对象能使用父类被继承或重写的成员方法、被继承或隐藏的成员变量。 (3)如果子类重写了父类的方法,则上转型对象调用该方法时一定是重写后的方法(多态性)。 (4)如果子类重新定义了父类的同名字段,即隐藏了父类的字段,则上转型对象访问该字段时必定是父类本身的字段。,【例8-4】编程,测试子类对象的上转型对象以及还原后的子类对象。,例8-4,8.5.2 子类变量不能引用父类对象,父类对象没有下转型对象。 父类对象不能直接赋值给子类变量,子类变量不能直接引用父类对象。 如果一定要引用,则必须使用强制类型转换,语法: (类型名) 变量 比如: Pupil4 pupil = (Pupil4)human; 注意:并不是所有强制类型转换都能成功,例如:把马类的动物强制转换为鸟,就无法转换。无法转换时会引发异常。,8.5.3 兄弟类对象不能相互替换,如果鸟类、马类和鱼类都继承动物类,则它们是同一层次的,是兄弟(姐妹)类。 显然,鸟不是马,鸟也不是鱼,因此,不能把鸟对象赋给马类或鱼类声明的变量。 同一层次的兄弟类变量之间不能相互赋值,即兄弟类对象间不能相互替换。,8.6 多态性,类的多态性: 一是类本身, 二是作为父类专用于派生, 三是通过实现接口而充当接口的实例类型。 多态主要反映在方法重写(覆盖)和方法重载这两个方面。,8.6.1 方法重写,【例8-5】编程,测试方法重写方面的多态性。 class Mammal /哺乳动物类 public void Shout() /呼叫方法 System.out.println(“不同类的动物叫声不同“); class Cat extends Mammal /继承哺乳动物类的猫类 public void Shout() /重写呼叫方法 System.out.println(“猫的叫声:喵.喵.“); class Dog extends Mammal /继承哺乳动物类的狗类 public void Shout() /重写呼叫方法 System.out.println(“狗的叫声:汪.汪.“); ,class Tiger extends Mammal /继承哺乳动物类的虎类 public void Shout() /重写呼叫方法 System.out.println(“虎的叫声:吼.吼.“); public class Example5 public static void main(String args) Mammal animal; animal = new Cat(); animal.Shout(); animal = new Dog(); animal.Shout(); animal = new Tiger(); animal.Shout(); ,8.6.2 方法重载,方法重载:在一个类中定义多个同名但签名不同的方法。 例如两数相加方法add(a, b),参数类型组合有4种(多态):整整、整实、实整、实实,因此可定义4个同名但参数类型不同的方法(详见第3章3.5节“方法签名与方法重载”的例3-2)。,8.7 本章小结,类的继承与派生是一对互逆关系。 类是单一继承的,最顶层是根类Object。 protected主要作用是声明能被所有派生子类继承的成员。 关键字super与超(父)类相关,可以调用超类构造方法,也可访问被子类隐藏的父类字段,或调用重写的父类方法。 把子类对象赋给父类声明的变量,就变成了上转型对象。 但子类变量不能引用父类对象,兄弟类对象也不能相互替换。 关于多态性,主要表现在方法重写和方法重载上。前者涉及到两个类,属于运行时多态,也叫动态多态性。而方法重载则是在一个类内部,属于编译时多态,也叫静态多态性。它们的共同点是方法名相同。,8.8 实训8:人类派生与动物类派生,(1)编程,编写人类Human,有私有的姓名、性别和年龄字段,定义获取各个私有字段的受保护方法,再定义公共的构造方法和思考方法。编写继承人类的学生类Pupil,有私有的学号字段以及获取该字段的受保护方法,还有公共的构造方法和学习方法。再编写继承学生类的大学生类Student,有公共的构造方法、自学方法和输出数据方法。最后设计一个入口主类,构造若干个大学生,把他们的数据和行为列举出来。,(2)编程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业文化建设对法律风险预防的作用
- 2025年银行业同业贷款协议规范文本
- 2025年双方协商的离婚安置协议范本
- 企业跨境经营中的责任问题与应对
- 统筹推进教师教育能力提升的面临的问题、机遇与挑战
- 构建出版业融合发展风险管理评估
- 绿色能源与抽水蓄能的深度融合
- 智能农业的新纪元
- 地理学全景解读
- 构筑智慧城市蓝图
- 统编版一年级下册道德与法治第四单元学先锋做先锋第一课时教学设计
- 中国科学院大学《高级人工智能》2023-2024学年第一学期期末试卷
- 国家开放大学本科《机器人技术及应用》形考期末考试题及答案汇总
- PHC管桩有效预应力
- 出院证(标准模板)
- 深圳市视频门禁报警系统联网数据规范
- 急性上消化道出血课件
- 不饱和聚酯树脂化学品安全技术说明书MSDS
- 气田磨溪区块外围地区龙王庙组储层特征描述
- 学生请假安全承诺书
- (最新整理)模板-消防安全评估质量过程控制体系(山东)
评论
0/150
提交评论