Java 教案-第11章 继承和多态
继承与多态.ppt
Java语言 程序设计
Java工程师系列
4.1 继承的概念
继承(inheritance)是面向对象的程序设计中最为重要的特征之 一。
在Java语言中,可以从已有的类派生出新类,这叫继承 (inheritance)。
由继承而得到的类为子类(subclass),被继承的类为父类或 超类(superclass)。
计算机与信息技术学院
Java语言 程序设计
4.6 多态(思想)
Java工程师系列
多态为什么是面向对象程序的重要特性?
利用多态,编制求圆和矩形面积的类,并编制测试类。 TestRC.java
逻辑多态思想示例分析
假设生产小汽车有四个步骤:钢板切割、压模、组装、喷漆。但是生产每 种小汽车具体步骤内容又有所不同。若有100种小汽车,则计算机仿真的生 产过程描述如下。
3.域的添加
子类可以新加一些方法。
计算机与信息技术学院
Java语言 程序设计
4.4 继承中方法重载与重写
实例: ProjectManager.java
Java工程师系列
计算机与信息技术学院
Java语言 程序设计
Java工程师系列
4.4 继承中方法重载与重写
方法重载是指一个类中的多个方法具有相同的名字,但这些方法的参数必 须不同,即或者是参数的个数不同,或者是参数的类型不同。父类有自己 的重载方法,子类也可以有自己的重载方法。
一个类只能有一个直接父类。
计算机与信息技术学院
Java语言 程序设计
Java工程师系列
4.1 继承的概念
子类继承父类的状态和行为,同时也可以修改父类的状态或重载父类的行 为,并添加新的状态和行为。
《java面向对象程序设计-继承和多态》教案
1. 理解继承的概念及其在Java中的应用。
2. 掌握如何使用extends关键字来实现继承。
3. 理解多态的概念及其在Java中的应用。
4. 掌握如何使用implements关键字来实现多态。
5. 能够运用继承和多态编写更加灵活和可扩展的Java程序。
二、教学内容1. 继承的概念和作用引入继承的概念,解释其作用和意义。
通过实例演示继承的效果。
2. 使用extends关键字实现继承介绍extends关键字的用法。
示例演示如何使用extends实现继承。
3. 多态的概念和作用引入多态的概念,解释其作用和意义。
通过实例演示多态的效果。
4. 使用implements关键字实现多态介绍implements关键字的用法。
示例演示如何使用implements实现多态。
5. 继承和多态的联合使用解释继承和多态联合使用的效果。
通过实例演示继承和多态的联合使用。
1. 采用案例教学法,通过具体的实例来讲解继承和多态的概念和使用方法。
2. 使用互动式教学法,鼓励学生积极参与讨论和提问,以加深对知识点的理解。
3. 使用代码演示和调试,让学生直观地看到继承和多态的效果。
四、教学步骤1. 引入继承的概念,解释其作用和意义。
2. 介绍extends关键字的用法,并通过示例演示如何使用extends实现继承。
3. 引入多态的概念,解释其作用和意义。
4. 介绍implements关键字的用法,并通过示例演示如何使用implements实现多态。
5. 示例演示继承和多态的联合使用。
五、教学评估1. 课堂练习:要求学生编写简单的Java程序,运用继承和多态来实现特定的功能。
2. 课后作业:布置相关的编程作业,要求学生运用继承和多态来解决实际问题。
3. 课堂讨论:鼓励学生积极参与讨论,提问和解答问题,以评估学生对知识点的理解程度。
六、教学内容(续)6. 继承和多态的应用场景分析实际编程场景中继承和多态的运用。
通过案例展示继承和多态如何提高代码的可复用性和可维护性。
java-继承PPT课件
super(name, id); //此行删除编译错
this.university = university;
this.school = school;
}}
public class Test{
8
class A{ private int x = 1; int y; void printX(){ System.out.println(x); }
} class B extends A{
int z; } public class Test{
public static void main(String []s){ B b = new B(); b.printX();
11.7-8 多态性、动态绑定和一般程序设计11.13用数组线性表类ArrayList来自定
11.9 对象转换和instanceof运算符
义存储任意对象的栈类
11.14 Protected数据和方法
11.15 final防止扩展和重写
补充:11.15 数据域和静态方法的隐藏
补充:11.16 初始化模块
public int a = 10; protected int b = 20; int c = 30; private int d = 40; public int getD() { return d; } }
public class B extends A { public int e; public void tryVariables() { System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); System.out.println(getD()); }
JAVA-继承与多态PPT学习课件
5
2020年2月16日星期日
Java程序设计 EmployeeClass类与ManagerClass类的关系图
6
2020年2月16日星期日
Java程序设计
// file name:EmployeeClass.java
public class EmployeeClass {
// 雇员类
private String name;
9
2020年2月16日星期日
Java程序设计 ShapeClass类、RectangleClass类与 SquareClass类之间的关系类图
ShapeClass类是几何图元的通用类;矩形是一种特定的几何图元,因此, RectangleClass类应该是ShapeClass的子类;正方形是一种特殊的矩形, 所以SquareClass类是RectangleClass类的子类。
public double getSpecial() { ... }
public String toString() { ... }
}
8
2020年2月16日星期日
Java程序设计
举例:设计与几何图元有关的类。
问题分析:几何图元是指可以绘制的基本几何图形,例如矩形、正 方形、圆形、多边形等。鉴于篇幅的考虑,这里只考虑矩形与正方 形。 假设任何几何图元都有颜色与位置两个属性,因此应该将这些共有 特性定义在一个类中,它是顶层类;而矩形还应该有长、宽两个属 性,由于矩形是一种几何图元,所以它自然应该拥有几何图元的共 有特性,因此可以将矩形类设计为几何图元类的子类;因为正方形 是一种特殊的矩形,它的特殊性在于长与宽相等,所以应该将正方 形类设计为矩形的子类。
// 颜色属性
private Point place; // 位置属性
java继承与多态
java继承与多态继承继承:可以让⼦类继承⽗类,这样⼦类会继承⽗类所有的属性和⽅法。
然⽽在Java中是不允许有多继承的,即⼀个⼦类只能继承⼀个⽗类,不能同时继承多个⽗类。
如果⼀个类还需要另外⼀个类的⽅法,可以让⽗类去继承需要的类。
但Java中⽀持多重继承,即⼀个⼦类也可以做为其他类的⽗类。
Object类:是Java中的祖宗类,当⼀个类在代码层⾯没有去继承任何的⽗类,那这个类默认会继承object类。
继承的重写(覆盖):⼦类继承⽗类以后,可以获取到⽗类的所有⽅法(包含被private修饰的⽅法,只是访问不到),如果⽗类的⽅法功能不能满⾜⼦类的需求,那么⼦类可以根据需求对这个⽅法进⾏重写。
Super关键字:⼦类继承⽗类后,⼦类可以通过super关键字去指向⽗类的元素(属性,构造⽅法,普通⽅法)。
如果是指向⽗类的构造⽅法:super()如果是指向⼦类的构造⽅法:this()注:像super(),this()这样的表达式只能存在于构造⽅法中,且只能出现⼀次。
如果是指向⽗类的普通⽅法:super.⽅法名称()如果是指向⽗类的属性:super.属性名称()构造⽅法的继承:在继承时,当⼦类⽤到默认的⽆参构造⽅法时,⽗类必须要有⽆参构造⽅法,不然⼦类的构造⽅法就会报错。
因为⼦类继承⽗类之后,获取到了⽗类的内容(属性/字段),⽽这些内容在使⽤之前必须先初始化,⼦类如果在没有⾃定义构造⽅法的情况下默认会有⼀个⽆参构造⽅法,其中第⼀⾏默认会有⼀个super(),所以必须先调⽤⽗类的构造函数进⾏内容的初始化。
所以⽗类必须要有⼀个⽆参构造⽅法。
⼦类直接继承得到的属性⽆法直接获取,可以通过⽗类的get和set⽅法来获取和修改属性。
public class Animal {private String name;private int age;private String hobby;public Animal(){}public Animal(String name, int age, String hobby) { = name;this.age = age;this.hobby = hobby;}}public class Dog extends Animal {public Dog(String name, int age, String hobby) {super(name, age, hobby);}}⽅法重写与⽅法重载的区别:⽅法重写override:⽅法重写是指⼦类在继承了⽗类之后需要对⽗类的⼀些⽅法进⾏修改,以适应程序需求,因此在⼦类中重写⽗类中原有的⽅法。
《java面向对象程序设计继承和多态》教案
《Java面向对象程序设计-继承和多态》教案第一章:引言1.1 课程简介本课程旨在帮助学生掌握Java面向对象程序设计中的继承和多态概念。
通过学习,学生将能够理解继承和多态的原理,并能够运用它们解决实际编程问题。
1.2 课程目标理解继承的概念和原理掌握如何使用继承来实现代码复用理解多态的概念和原理掌握如何使用多态来实现动态绑定第二章:继承2.1 继承的概念介绍继承的定义和作用解释为什么使用继承2.2 继承的语法介绍如何使用extends关键字实现继承解释继承中的构造函数和继承关系2.3 继承的实现演示如何使用继承来复用代码解释继承的层次结构和菱形继承第三章:多态3.1 多态的概念介绍多态的定义和作用解释多态的好处3.2 方法重写解释方法重写的概念和规则演示如何使用方法重写来实现多态3.3 方法重载解释方法重载的概念和规则演示如何使用方法重载来提高代码可读性第四章:继承和多态的案例分析4.1 案例一:动物和鸟类使用继承和多态来定义动物和鸟类的关系实现动物和鸟类的属性和方法4.2 案例二:形状和圆形使用继承和多态来定义形状和圆形的关系实现形状和圆形的属性和方法第五章:总结和练习5.1 课程总结回顾继承和多态的概念和原理强调继承和多态在面向对象程序设计中的重要性5.2 练习题提供一些练习题,以帮助学生巩固所学知识第六章:继承和多态的深入理解6.1 继承的类型解释接口继承和类继承的区别讨论继承的优点和缺点6.2 多态的应用探讨多态在日常编程中的应用场景分析多态如何提高程序的可扩展性和灵活性第七章:Java中的继承和多态实例7.1 继承实例:汽车和摩托车通过实例展示如何使用继承来创建汽车和摩托车类演示如何通过继承来扩展属性和方法7.2 多态实例:支付接口和具体的支付方式创建一个支付接口和多个具体的支付方式类演示如何使用多态来实现不同的支付方法第八章:继承和多态的陷阱与最佳实践8.1 继承的陷阱讨论继承可能带来的过度耦合问题解释如何避免继承的陷阱8.2 多态的陷阱分析多态可能导致的类型不匹配问题探讨如何安全地使用多态8.3 最佳实践提供使用继承和多态的最佳实践指南强调代码可读性和可维护性第九章:继承和多态在设计模式中的应用9.1 设计模式简介介绍设计模式的概念和重要性解释设计模式与继承和多态的关系9.2 继承和多态在设计模式中的应用案例通过案例分析展示继承和多态如何在设计模式中发挥作用讨论设计模式如何提高程序设计的质量和可复用性第十章:课程回顾与拓展学习10.1 课程回顾总结本课程的重点内容和关键概念强调继承和多态在实际编程中的应用10.2 拓展学习资源提供一些拓展学习的资源和建议鼓励学生继续深入学习面向对象程序设计的其他方面第十一章:继承和多态的实际应用案例11.1 案例分析:图形库的设计通过分析图形库的设计,展示继承和多态如何用于实现复杂的图形操作。
继承与多态的教案
继承与多态的教案教案标题:继承与多态的教案教学目标:1. 理解继承和多态的概念;2. 能够使用继承创建一个类,并通过多态实现不同子类的特定功能;3. 能够解释继承和多态的优点和应用场景。
教学准备:1. 计算机编程语言教材和教具;2. 计算机编程软件;3. 示例代码和练习题。
教学过程:引入:1. 引导学生回顾之前学习的面向对象编程概念,如类、对象、封装和继承;2. 提问学生对继承和多态的理解,引发学生的思考。
讲解:1. 介绍继承的概念和作用,解释父类和子类之间的关系;2. 示例代码演示如何通过继承创建一个子类,并继承父类的属性和方法;3. 引导学生思考继承的优点和应用场景,如代码复用和扩展性。
练习:1. 分发练习题,要求学生根据给定的需求创建一个父类和两个子类,并实现特定功能;2. 学生在计算机编程软件上编写代码,运行并测试其结果;3. 学生互相交流并讨论各自的实现方法,分享经验和解决问题的思路。
讲解:1. 介绍多态的概念和作用,解释多态的实现方式;2. 示例代码演示如何使用多态实现不同子类的特定功能;3. 引导学生思考多态的优点和应用场景,如代码灵活性和可扩展性。
练习:1. 分发练习题,要求学生根据给定的需求创建一个父类和多个子类,并实现特定功能;2. 学生在计算机编程软件上编写代码,运行并测试其结果;3. 学生互相交流并讨论各自的实现方法,分享经验和解决问题的思路。
总结:1. 回顾继承和多态的概念和作用;2. 强调继承和多态的优点和应用场景;3. 鼓励学生继续深入学习面向对象编程的相关知识。
拓展活动:1. 鼓励学生在日常生活中观察和思考继承和多态的实际应用;2. 提供更多的编程练习和挑战,以提高学生对继承和多态的理解和应用能力。
评估方式:1. 观察学生在课堂上的参与和表现;2. 收集学生完成的练习题和代码,并进行评估;3. 针对学生的理解和应用能力,给予反馈和指导。
教学反思:1. 总结学生在课堂上的学习情况和反馈;2. 分析教学过程中的不足和改进之处;3. 调整教学策略和方法,以提高教学效果。
《java面向对象程序设计继承和多态》教案
《Java面向对象程序设计-继承和多态》教案一、教学目标1. 理解继承的概念和特点2. 掌握如何使用继承实现代码复用和扩展3. 理解多态的概念和特点4. 掌握如何使用多态实现动态绑定和灵活扩展5. 能够运用继承和多态解决实际编程问题二、教学内容1. 继承的概念和特点继承的定义继承的优点:代码复用、扩展性好继承的缺点:代码耦合度高、可读性下降2. 继承的实现继承的语法:extends关键字继承的访问权限:private、protected、public 继承的类型:单继承、多继承3. 多态的概念和特点多态的定义多态的优点:动态绑定、灵活扩展多态的缺点:性能开销、复杂性增加4. 多态的实现方法重写:override关键字方法重载:相同方法名、不同参数列表接口和实现:implements关键字5. 继承和多态的应用实例:动物类和鸟类的关系实例:形状类和圆形类的关系三、教学方法1. 讲解:通过PPT和代码示例讲解继承和多态的概念、语法和应用2. 演示:通过代码演示继承和多态的实现和效果3. 练习:让学生编写代码练习继承和多态的应用4. 讨论:分组讨论继承和多态的使用场景和注意事项四、教学环境1. 教室:equipped with projector and whiteboard2. 电脑:each student has access to a puter with Java Development Kit (JDK) installed3. 网络:stable internet connection for online resources五、教学评估1. 课堂参与:观察学生在课堂上的提问和回答问题的积极性2. 练习完成情况:检查学生完成练习的情况和代码质量3. 小组讨论:评估学生在讨论中的表现和团队合作能力4. 课后作业:布置相关的课后作业,评估学生的理解和应用能力六、教学活动1. 引入讨论:通过一个现实生活中的例子(如交通工具的分类)引入继承的概念。
《java面向对象程序设计继承和多态》教案
《Java面向对象程序设计-继承和多态》教案一、教学目标:1. 理解继承的概念及其在Java中的应用。
2. 掌握如何使用extends关键字来实现继承。
3. 理解多态的概念及其在Java中的应用。
4. 掌握如何使用implements关键字来实现多态。
5. 能够运用继承和多态编写更简洁、易维护的Java代码。
二、教学内容:1. 继承的概念和原理2. extends关键字的用法3. 多态的概念和原理4. implements关键字的用法5. 继承和多态的应用案例三、教学方法:1. 讲授:讲解继承和多态的基本概念、原理和用法。
2. 演示:通过示例代码展示继承和多态的应用。
3. 练习:让学生动手编写代码,加深对继承和多态的理解。
4. 讨论:分组讨论实际应用场景中如何使用继承和多态,分享心得。
四、教学准备:1. 讲义:提供详细的继承和多态概念、用法讲解。
2. 示例代码:准备继承和多态的示例代码。
3. 编程环境:确保学生能够使用IDE(如Eclipse、IntelliJ IDEA等)或文本编辑器进行代码编写。
五、教学步骤:1. 引入:简要介绍继承和多态的概念,激发学生的兴趣。
2. 讲解:详细讲解继承和多态的原理、用法,并通过示例代码进行演示。
3. 练习:布置练习题,让学生动手编写代码,巩固所学内容。
4. 讨论:组织学生分组讨论实际应用场景中如何使用继承和多态,分享心得。
5. 总结:回顾本节课所学内容,强调重点知识点。
6. 作业:布置课后作业,巩固所学知识。
六、教学评估:1. 课堂互动:观察学生在课堂上的参与程度,了解他们对继承和多态的理解程度。
2. 练习作业:评估学生的练习作业,检查他们对继承和多态的掌握情况。
3. 课后反馈:收集学生的课后反馈,了解他们对课堂内容的满意度和建议。
七、教学拓展:1. 深入讲解Java中的继承和多态的其他高级特性,如接口、抽象类、动态绑定等。
2. 通过案例分析,让学生了解继承和多态在实际项目中的应用和优势。
《java面向对象程序设计-继承和多态》教案
一、教学目标1. 理解继承的概念及其在Java中的实现。
2. 掌握如何使用继承来复用代码和实现接口。
3. 理解多态的概念及其在Java中的应用。
4. 掌握如何通过方法重写和接口实现来实现多态。
5. 能够运用继承和多态编写更加灵活和可扩展的Java程序。
二、教学内容1. 继承的概念和原理定义:继承是面向对象编程中的一种关系,允许一个类(子类)继承另一个类(父类)的属性和方法。
作用:实现代码复用,减少重复代码。
2. Java中的继承语法:class 子类extends 父类示例:通过一个简单的继承例子来展示如何使用继承。
3. 访问修饰符公共(public)、默认(default)、私有(private)和受保护(protected)修饰符在继承中的作用。
示例:演示不同修饰符对继承的影响。
4. 方法重写(Overriding)概念:子类重写父类中的方法。
规则:方法名、参数列表和返回类型必须与父类中的方法相同。
示例:通过一个例子展示如何重写方法,并解释其意义。
5. 多态的概念定义:多态允许一个接口具有多个不同的实现。
类型:编译时多态(静态多态)和运行时多态(动态多态)。
三、教学方法1. 讲授法:讲解继承和多态的基本概念。
2. 示例法:通过具体的代码示例来展示继承和多态的应用。
3. 互动提问:鼓励学生提问,并针对学生的疑问进行解答。
4. 练习法:提供练习题,让学生通过编写代码来加深对知识点的理解。
四、教学步骤1. 引入:通过一个现实生活中的例子(如交通工具)来引出继承的概念。
2. 讲解:详细讲解继承的语法和规则,并通过代码示例展示如何实现继承。
3. 演示:通过示例解释访问修饰符在继承中的作用。
4. 讲解:介绍方法重写的概念和规则,并通过示例展示如何重写方法。
5. 引入:通过一个图形绘制例子引入多态的概念。
6. 讲解:详细讲解多态的原理和应用,并通过代码示例展示多态的实现。
五、教学评估1. 课堂提问:通过提问了解学生对继承和多态的理解程度。
Java《继承和多态》
一切类的“祖先”——Object
在Java 中,所有的Java类都直接或间接地继承了ng.Object类
public class MyObject { //… } public class MyObect extends Object { //… }
学习java API文档了解下面内容: object类,它是所有类的根点,所有类从它继承。 equals,两空值进行比较永远返回 false。 Java中对 String类 中的 equals方法进行了重写。
转型规则
父类的引用变量可以指向一个子类的对象,但不可以 访问子类中新增加的成员(方法和变量); 父类对象不能操作子类声明定义的成员变量;也不能 使用子类声明定义的方法。 父类对象可以调用子类重写的实例方法。 父类对象可以调用子类继承的成员变量和隐藏的成员 变量。 可以将对象的父类对象再强制转换到一个子类对象, 这时,该子类对象又具备了子类所有属性和功能 如果子类重写了父类中的类方法,通过父类对象引用 的是父类中的类方法
继承与方法重写
子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法
public class Teacher { private String name; // 教师姓名 private String center;// 所在单位 public Teacher (String myName, String myCenter) { //初始化属性值 } public void giveLesson() { //授课方法的具体实现 } public void introduction() { //自我介绍方法的具体实现 } } public class SoftwareTeacher extends Teacher public SoftwareTeacher(String myName, String myCenter) { super(myName, myCenter); } public void giveLesson(){ System.out.println(“使用电脑授课"); super.giveLesson(); } }
JAVA继承与多态
JAVA继承与多态第⼀节、继承⼀、继承的概念、格式、特点(⼀)继承的概念:1、继承是多态的前提,如果没有继承,就没有多态。
2、继承解决的主要问题是:共性抽取。
3、⾯向对象的三⼤特征:封装性、继承性、多态性。
(⼆)继承的格式⽗类的格式:(即普通类)public class ⽗类名称 {// ...}⼦类的格式:public class ⼦类名称 extends ⽗类名称 {// ...}(三)继承的三个特点(单继承、多层继承、相对继承)1、Java只⽀持单继承,不⽀持多继承。
2、Java⽀持多层继承(继承体系)。
3、⼦类和⽗类是⼀种相对的概念。
⼆、继承中的变量(⼀)成员变量的访问(直接、间接)在⽗⼦类的继承关系当中,如果成员变量重名,则创建⼦类对象时,访问有两种⽅式:1、直接通过⼦类对象访问成员变量:等号【左边】是谁,就优先⽤谁,没有则向上找。
2、间接通过成员⽅法访问成员变量:该⽅法【属于】谁,就优先⽤谁,没有则向上找。
(⼆)⼦类⽅法中重名的三种变量区分(局部、本成、⽗成)1、局部变量:直接写局员变量名2、本类的成员变量: this.成员变量名3、⽗类的成员变量: super.成员变量名三、继承中的⽅法(⼀)成员⽅法-覆盖重写1、访问:在⽗⼦类的继承关系当中,创建⼦类对象,访问成员⽅法的规则:创建的对象是谁,就优先⽤谁,如果没有则向上找。
注意事项:⽆论是成员⽅法还是成员变量,如果没有都是向上找⽗类,绝对不会向下找⼦类的。
重写(Override):⽅法的名称⼀样,参数列表【也⼀样】。
覆盖、覆写。
重载(Overload):⽅法的名称⼀样,参数列表【不⼀样】。
2、重写(Override)概念:重写要求两同两⼩⼀⼤原则:⽅法名相同,参数类型相同,⼦类返回类型⼩于等于⽗类⽅法返回类型,⼦类抛出异常⼩于等于⽗类⽅法抛出异常,⼦类访问权限⼤于等于⽗类⽅法访问权限。
(1)必须保证⽗⼦类之间⽅法的名称相同,参数列表也相同。
java中继承教案
java中继承教案以下是一个简单的Java中继承的教案示例:教学目标:1. 理解继承的概念和作用。
2. 掌握继承的实现方式。
3. 掌握方法的重写和super关键字的使用。
教学内容:1. 继承的概念和作用2. 继承的实现方式3. 方法的重写和super关键字的使用教学步骤:一、导入新课通过一个简单的例子引入继承的概念,比如一个动物类和一个猫类,猫类继承了动物类的属性和方法。
二、讲解概念和作用1. 继承的概念:子类继承父类的属性和方法,并且可以添加自己的属性和方法。
2. 继承的作用:代码重用、多态性、增加代码的可维护性和可读性。
三、实现继承1. 通过使用extends关键字实现继承,比如:class Cat extends Animal。
2. 子类可以添加自己的属性和方法,比如:class Cat extends Animal { ... }。
3. 子类可以重写父类的方法,比如:class Cat extends Animal { public void eat() { ... } }。
四、方法的重写和super关键字的使用1. 子类可以重写父类的方法,但是方法名、参数列表和返回值类型必须相同。
比如:class Cat extends Animal { public void eat() { ... } }。
2. super关键字可以调用父类的方法,比如:()。
3. super关键字还可以访问父类的属性,比如:。
五、练习和巩固1. 编写一个简单的Java程序,演示继承的概念和实现方式。
2. 编写一个简单的Java程序,演示方法的重写和super关键字的使用。
Ch11_java继承和多态
4
简化的Student类
class Student { private String name; private String studentId; public String getName() { return name; } public void setName(String newName) { name = newName; } public String getStudentId() { return studentId; } public void setStudentId(String newId) { studentId = newId; }
➢ 员工每周的工作时间40小时 ➢ 普通员工年薪$40000,负责开发市场的员工年薪
$50000,法律秘书年薪$45000
➢ 普通员工每年享有两周带薪假期,而律师可以有三 周带薪假期
➢ 普通员工申请休假需要填写黄色表格,而律师需要 填写一种特殊的粉色表格
➢ 每类员工需要完成不同的工作:律师要负责打官司; 市场开发人员负责广告推广;秘书负责听写记录, 法律秘书负责撰写法律文书
Step1:提炼名词
16
员工
普通员工
去掉
重复
负责开发市场的员工
律师
法律秘书
秘书
员工 负责开发市场的员工 律师 法律秘书 秘书
Step2:确定类之间的关系
17
员工
负责开发 市场的员工
律师
秘书 法律秘书
Step3:抽象行为
18
员工:获取工作时间,获取薪水,申请休假,带薪 假期 负责市场开发的员工:获取工作时间,获取薪水, 申请休假,带薪假期,负责推广 律师:获取工作时间,获取薪水,申请休假,带薪假期, 打官司 秘书:获取工作时间,获取薪水,申请休假,带薪假期, 听写记录 法律秘书:获取工作时间,获取薪水,申请休假,带薪 假期,听写记录,撰写法律文书
Java语言与面向对象程序设计第11讲(继承与多态)
【问题】 问题】 子类对象虽然可以调用父类的方法 getInfo,但无法显示自己特有的津贴 , 信息,如何解决这个问题?? 信息,如何解决这个问题??
Java语言与面向对象程序设计第11讲
【课堂示例(二)】 课堂示例(
P116:例5-8 多态测试。
CASE2:eg5_8.java
5.3.4 对象引用的多态
(3)如果一个方法的形式参数定义的是父类对象, )如果一个方法的形式参数定义的是父类对象, 那么调用这个方法时, 那么调用这个方法时,可以使用子类对象作为实际 参数。 参数。
Java语言与面向对象程序设计第11讲
【课堂示例(一)】 课堂示例(
P115:例5-7 多态测试。
Employee emp2 = new Manager("李宏",54,3000f,500f); System.out.println(emp2. name); System.out.println(emp2. allowance); //编译时出错, 编译时出错, 编译时出错 如何解决此问题?? 如何解决此问题 System.out.println(emp2.getTotal()); //如何解决此问题??
Employee emp = new Manager(…); Manager mgr = (Manager)emp; //下述类型转换是错误的 Employee emp = new Employee(…); Manager mgr = (Manager)emp;
Java语言与面向对象程序设计第11讲
Java语言与面向对象程序设计第11讲
5.3 多态
5.3.1 多态的概念
多态是面向对象程序设计的又一个特殊特性。利用面向过程的语 言编程,主要工作是编写一个个过程或函数。这些过程和函数各 自对应一定的功能,它们之间是不能重名的,否则在用名字调用 时,就会产生歧异和错误。而在面向对象的程序设计中,有时却 需要利用这样的“重名”现象来提高程序的抽象度和简洁性。 所谓多态,是指一个程序中同名的不同方法共存的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第11章继承和多态11.1介绍(Introduction)面向对象编程允许从已有的类派生出新类,这叫继承(Inheritance)。
继承是软件代码重用的一种机制,是一种在面向对象编程中非常重要的,而且强大的特性。
假设已经定义了一个圆形,矩形和三角形的模型类,这些类有许多相同的特征,如何设计才能避免冗余,而且还能使系统易于理解和维护?答案就是使用继承。
11.2超类和子类不同的类可能包含一些相同的,公共的特性和行为,把这些相同的东西组合在一起形成一个新的公共类来被其他类共享。
继承就是定义一个一般类,然后扩展这个一般类形成更多的特殊类。
这些特殊类继承了一般类的某些属性和操作。
这些类的对象我们可以称为几何对象,那么就创建一个称为几何类的一般类,这个一般类包含几何元素中的一些公共的属性和操作,如可以填充元素,修改线条的颜色,或撤销填充等。
因此一般类GeometricObject可以作为所有几何对象的一般类模型。
如图一般类的UML图,以及特殊类之间的关系图。
在Java术语中,一个类C1是从C2扩展来的,那么C1类称为子类,C2类称为父类或超类。
子类继承父类可访问的数据和方法,同时可以扩展出自己的新的数据和方法如上图所示。
代码如下。
思考一下,如下定义的构造方法是否正确?为什么?答案是否定的,原因就是子类不能访问父类的私有的数据,但可以通过调用父类的get或set方法来访问它。
关于继承的几点注意:1.子类不是超类的一个子集,实际上子类包含父类,并对其进行了扩展,内容比父类更丰富。
2.父类中私有的数据不能被它之外的任意类访问。
因此,它们不能在子类中被直接使用。
但是,如果在父类中定义了setter或getter,可以通过使用它们来访问这些数据。
3.并不是所有的is-a的关系都是继承关系,例如,一个方形是一个矩形,但却不能使用方向矩形来扩展方向,因为没有什么可扩展的。
但却可以从几何类中进行扩展定义方形类。
因为新的子类要比父类包含更多的详细信息。
4.继承被用来模型化is-a的关系。
不要盲目的为了重用方法而扩展类。
例如,没必要把一个树类扩展为人类,尽管二者具有很多相同的属性,比如高度和重量。
子类和父类之间必须存在is-a的关系。
5.很多其他的编程如c++允许一个子类可以从几个父类扩展和继承,称多重继承,但Java不允许多重继承,即严格的单继承。
即一个类的声明中只能有一个关键字extends,而且后面只有一个类名。
如果想要拥有若干个类的特性,可以实现接口(在14章讲授)。
11.3supper关键字子类继承了父类可访问的数据和方法,它是否继承构造方法呢?父类的构造方法可以在子类中被调用吗?在前面一章中,介绍过一个关键字this,表示对象自己。
Super关键字则指它的父类,有2种方式被使用。
1.调用父类构造方法。
2.调用父类的其他方法11.3.1 调用父类构造方法调用父类的构造方法的格式如下:其中super()调用父类无参数的构造方法,super(argument)调用父类和参数argument匹配的构造方法。
但需注意的是,不管是使用哪条语句,调用父类的构造方法语句必须放在子类定义的构造方法之前,并且只能显示的调用父类的构造方法。
如下语句是正确的。
父类的构造方法必须使用super关键字调用。
构造方法被用来创建类的实例,不像属性和方法,父类的构造方法是不能继承的,只能使用super通过在子类中调用父类的构造方法。
11.3.2 构造链构造方法可以调用重载的构造方法,或其父类的构造方法。
如果二者都没显式调用,编译器会自动在子类构造方法前添加super(),如下图所示。
在任何情况下,利用构造方法创建一个类的实例时,会沿着它的继承链向上所有的父类的构造方法都要被调用。
当构造一个子类对象时,子类构造方法先调用父类的构造方法,然后才能履行自己的其他任务。
如果这个父类又是由另外一个类派生的,那么它父类的构造方法在调用前,先要调用它祖父的构造方法,如此,直到最终没有父亲的类的构造方法被调用,然后返回。
这条构造方法的执行和返回的过程称构造链,如下代码。
如果一个类设计成被继承的类,即一般类,那么最好在类中提供无参数的构造方法来避免编程中的错误。
如下代码所示。
因为在Apple类中没有显式的定义,那么Apples的默认的无参数的构造方法会被添加上。
既然Apple是Fruit 的子类,那么在调用构造方法的时候,会先调用父类的构造方法,但Fruit没定义无参数的构造方法,系统不会为Fruit添加,因此这个程序不会被编译,会产生语法错误。
因此如果有可能,为了避免出错,在定义任何一个类时,最好提供无参数的构造方法。
11.3.3 调用父类方法关键字super也可以用来引用除构造方法之外的其他方法,如下语法:如下代码:11.4重写(Overriding)方法子类会从父类继承方法,有时,从父类继承的方法在子类中非常有必要被修改会改进来适应新类的需要。
这种对继承来方法的改写或改造称方法重写,也称方法覆盖。
例如GeometricObject类中的toString方法,返回一个代表几何对象的字串。
这个方法在Circle类中可以被重写成返回代表圆对象的字串,如下程序所示。
那么在使用的过程中是调用父类定义的方法还是子类重写的方法呢?在Circle类中,两个方法都可以被调用,使用的是具体哪个方法,根据语句的位置和具体语句的样式决定。
如果像一般调用方法一样使用这个方法,则使用的是改写的方法,如果想再Circle类中使用父类定义的toString方法,则要使用super.toString()才能调用。
那么能否以如下方式在Circle的子类中调用GeometricObject中定义的toString方法呢?答案是错误的,这会发生语法错误,关于重写,有以下2点值得注意:1.只有可访问的实例方法才能被重写,即私有方法不能被重写(因为在外类中根本不可见),如果同一个方法在父类中被定义成了私有的方法,而在子类中又被定义了,那么这2个方法没有关系,不是重写。
2.如实例方法一样,一个静态方法也可以被继承,但却不能被重写。
如果一个在父类方法中被定义为静态的,又被定义在子方法中,那么在父类中定义的那个静态方法会被隐藏,可以通过父类名来引用父类的静态被隐藏的方法。
11.5重写和重载重载意味着定义若干个名字相同,但参数和内容不同的方法。
重写意味着在子类中对继承的方法进行改写。
为了重写方法,方法的名字一定要和父类中定义的方法名相同,相同的参数列表和相同的返回类型。
举例来说明重载和重写的不同,如下图所示。
11.6Object类和toString()方法Java中的每个类都是Object类的子类,如果没有继承声明,那么在定义一个类的时候,这个类默认就是Object 类的直接子类,如下所示。
之前使用过的诸如String,Loan和GeometricObject都是Object的直接子类。
可以任何类中使用Object类中提供的方法,下面将介绍Object类的toString方法,头部描述如下。
对象调用此方法返回一个关于对象的描述,默认返回一个字符串的组合,包含对象实例的类名字@对象的十六进制内存地址,如下Loan类对象调用toString方法。
显示如Loan@1537e5之类的信息,这个信息并没多大用处,通常在新的子类中要重写这个方法,如下在GeometricObject中重写。
注意:可以直接使用System.out.print(object)调用,与System.out.print(object.toString())等价。
即System.out.print(Loan.toString())与System.out.print(Loan)等价。
11.7多态(Polymorphism)面向对象的三大特性就是封装,继承和多态,前2个都已经了解,这节介绍多态。
定义2个词汇:subtype和supertype。
一个类实际上就是定义一个类型,如果一个类被定义为某个类的子类,则称它为subtype,它的继承类称为supertpye。
继承关系使得子类继承父类的某些特性,同时可以添加自己独特的特征。
子类是父类的特例,每一个子类的实例也都是父类的实例,但反之不然。
例如,每个圆都是几何图像类的对象,但不是每个几何图像都是圆。
因此,总是可以把子类的一个实例作为参数传递给父类参数存在的任何位置,如下例。
一个子类的对象可以被用在父类对象出现的任何地方。
这就是普通意义的多态(Many forms),简单的说,多态就是父类型的变量可以被子类型对象赋值,即父类型变量指向子类型对象。
11.8动态绑定(Dynamic binding)一个方法可以被定义在父类中,并且在子类中被重写。
例如Object类中定义的toString方法,在GeometricObject被重写了,请看如下代码。
那么哪个toString方法会被对象o调用?重写的还是Object类中定义的?要回答这个问题,先要介绍2个概念:声明类型(declared type)和实际类型(actrual type)。
一个变量必须有声明类型,o对象声明类型为Object类型。
引用数据类型的变量可以指向一个null值或一个声明类型的实例,而这个实例可以是声明类型创建的,也可以是声明类型的子类创建的。
实际类型变量是对象实际指向的实例类型。
o的实际类型是GeometricObject类型。
对象o的toString方法是根据实际类型调用的,这就是所谓的动态绑定。
动态绑定的工作方式:假设一个对象o 是C1,C2,…,Cn类的实例,这里C1是C2的子类,C2是C3的子类,以此类推,如图所示。
如果对象o调用方法p,那么JVM就会按C1…Cn的顺序搜索p方法,一旦找到即执行,搜索停止。
匹配方法和绑定方法的实施是2个分开的步骤。
声明类型是决定在编译时那个方法会被匹配。
编译器在编译时根据参数类型,个数和顺序找到匹配的方法。
JVM在运行时动态的绑定方法的实施,决定变量的实际类型。
11.9对象类型强制转换和instanceof操作符已经清楚掌握基本数据类型的强制转换。
对于引用数据类型的类类型也可以进行强制类型转换,但有条件,只能发生在继承与被继承的类之间(直接或间接均可)。
如语句:m(new Student());实际上把new Student()这个匿名Student对象传递赋值给Object类型声明的变量,语句等价如下:直接把子类对象赋给父类声明的对象是允许的,即,此时子类对象会自动转换为父类对象为其赋值。
但假设我们想把Object对象o赋值给Student类型对象,如Student b=o; 就会发生编译错误。
为什么?原因是Student 实例对象同时也是Object实例对象,反过来,Object对象实例却不一定都是Student对象实例。