类的继承
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
添加新的子类
在车的继承结构中添加Truck类。 为该类添加一个吨位数属性。 重写printInfo()方法
几个其它继承的实例
人
学生
公司雇员
轮船
中学生 大学生 经理 普通员工
客轮
货轮
1、讨论:图所表示的关系 2、轮船——客轮的关系示例(共性与个性) 3、列举其它的类似关系
Java的单继承结构
Java面向对象程序设计 类的继承
内容提要
1
使用继承改善系统类的结构
2
类成员的继承规则
3
子类构造器
4
子类对父类方法的重写
汽车管理系统
系统是用于管理小轿车、客车等各类汽车资源的系统。 功能主要包括:维护、存储各类车的基本信息;提供汽车
信息列表输出等功能。
分析:针对系统要求,应设计哪些核心类?
实战演练
2.编写Manager类,该类继承于Employee类
(1)为其添加: • 两个属性:办公室officeID和年终分红bonus; • 一个构造器方法:带有4个参数的构造器方法,用于对除 bonus属性外的所有其它属性进行初始化; • 方法:officeID属性和bonus属性的相关set和get方法;
继承的Java实现
编写例3-3程序
在Java中使用关键字extends实现继承,其基本语法格式 为: class SubClassName extends SupClassName{ }
需要讨论二个问题: 1、子类中有什么?类成员的继承规则是怎样的? 2、在继承结构中,构造器是如何处理的?如何写子类 构造器方法。
ArrayList类的使用
ArrayList类的部分常用方法 add(Object o):在对象列表结构的最后添加对象元素 。 add(int index, Object element):在对象列表指定位 置插入新的对象元素。 remove(Object o) :从对象列表中移走对象。 clear():清空列表中的所有对象元素。 iterator():返回用于遍历对象集合的指针。
do-while 循环语句是直到型结构,它的语法格式如下:
[initialization]
do {
body;
[iteration;]
} while (loop-condition);
试一试: 编写使用do-while循环语句实现计算1到100的和的程 序段。
改善系统类结构
(2)重写Employee类中的方法raiseSalary(double proportion),经理涨工资的计算方法为在雇员工资涨幅的基础上 增加10%的比例。
实战演练
3.编写TemporaryEmployee(临时工)类,该类继承 于Employee类 (1)为其添加: • 一个属性:雇佣年限hireYears; • 构造器方法:用于初始化该类的所有属性; • 方法:hireYears属性的set和get方法; (2)重写Employee类中的方法raiseSalary(double proportion),临时工的工资涨幅为正式雇员的50%。
循环体部分(body):将被反复执行的代码,可以是一条语句, 也可以是一个语句块(复合语句)。
迭代部分(iteration):在一次循环结束后,下一次循环开始前 执行的语句,通常用于修改循环条件。
Java的循环控制结构
while和for循环语句对应当型结构,do…while语句对应直到型
结构。
Hale Waihona Puke Baidu初始化
初始化
false 循环条件
true 循环体
迭代部分
循环体
迭代部分 true
循环条件
false
当型循环结构
直到型循环结构
While循环
while的语法格式如下: [initialization] while (loop-condition){ body; [iteration;] }
宽都为0的矩形; 一个方法:方法isInside(double x,double y)。用于判断某个点
是否在矩形内部,如在矩形内,返回true, 否则,返回false。
实战演练
3.编写上题PlainRect类的测试程序 (1)创建一个左上角坐标为(10,10),长为20, 宽为10的矩形对象; (2)计算并打印输出矩形的面积和周长; (3)判断点(25.5,13)是否在矩形内,并打印输出相 关信息。
实战演练
2.编写一个具有确定位置的矩形类PlainRect,该类继 承于Rect类,其确定位置用矩形的左上角坐标来标识,为 该类添加:
两个属性:矩形左上角坐标startX和startY。 两个构造器方法: (1)带4个参数的构造器方法,用于对startX、startY、width
和height属性初始化; (2)不带参数的构造器方法,将矩形初始化为左上角坐标、长和
方法覆盖(重写)
重新运行Bus类的测试程序P79-P80 方法覆盖与方法重载的区别。
方法重载要求:方法名相同,参数数目或参数类型不同; 方法覆盖要求:子类的方法定义应与父类保持一致。即应与父类
有完全相同的方法名、返回值类型和参数列表,否则就不是方法 的覆盖,而是在子类中定义了自己的与父类无关的成员方法,此 外,方法的覆盖还应遵循以下规则: 覆盖方法的访问控制应该与它所覆盖的方法的访问控制相同或更 宽松; 覆盖方法不能比它所覆盖的方法抛出更多的异常。
Java的循环控制结构
Java的循环语句共有三种,它们是:
while 循环语句 for 循环语句 do…while循环语句。
循环结构由四个部分组成。
初始化部分(initialization):一条或多条语句,用来做一些初 始化的工作。
循环条件部分(loop-condition):一个boolean型的表达式, 根据它的值来判断是否继续下一次循环。
子类构造器
重新思考: 构造器的形式要求? 构造器的作用?
观察分析: Bus类与Car类构造器方法
理解子类构造器 在内存机制中,父类与子类占用同一块内存,只不过 子类在父类的基础上增加了自己的部分,即子类依附 于父类,先有父类再有子类。因此,构建对象时,也 要先构建父类的数据部分,再考虑子类增加的部分。
分析VehicleData类
问题: 1. 如何保存各类车信息? 2 .分析相关的add方法和list方法,比较异同。
ArrayList类的使用
ArrayList类封装了一个Object类型的数组,我们可以使 用它来维护一个Object的可变长数组。
ArrayList对象的创建 public ArrayList():默认的构造器,将会以默认大小( 16)来初始化内部的数组。 public ArrayList(int initialCapacity):用指定的大 小来初始化内部的数组。 public ArrayList(Collection c):用一个已有集合对 象来构造数组,并将该集合的元素添加到ArrayList的 数组中。
关系?
深入理解继承概念
面向对象中的继承是一个基于分类学的概念,继承描述的 是一种“is a”的关系。子类是父类在同一个分类分支上 的一个更为特殊的类,只有当类之间存在的是一种能够被 描述为:“子类 is a 父类”的时候,我们才使用继承。
汽车管理系统核心类
1.用于描述各种类型车信息的车类,如Car类、Bus类; 2.用于保存所有汽车基本信息的数据类。
分析: 1。Car类与Bus类各有什么成员属性和方法? 比较Car类与Bus类,发现什么异同?如果还需要其它 车类,怎么做?
VehicleData类
用于保存维护所有汽车基本信息;
如何有效减少Car类和Bus类代码的重复? 观察下图
基本思路: 将Car类与Bus类的共性抽象出来,上移到Vehicle类 中。 以Vehicle类为基础,构建Car类和Bus类。
相关概念
父类(或基类、超类)
子类(或派生类)
类的继承描述的是类与类之间的“is a ”关系,即子类是 比父类更为特殊的类,是父类的一种特例。继承机制的 优点在于为我们提供了一种类级的代码重用机制,使我 们可以在现有类的基础上,通过重用、修改或添加等方 法创建一个新类。
试一试: 请分析下面程序段的功能,绘制其流程图,并加以解释。 int count=1; //定义并初始化循环变量I int sum=0; //定义并初始化求和结果变量sum while(count<=100){ //循环求和 sum+=count; //循环体 count++; } System.out.println(“1+2+...+100=”+sum);//输出结果
numOfSeat){ super(type,brand,price); this.numOfSeat=numOfSeat;
} public void printInfo() { //重写父类中的printInfo()方法
super.printInfo(); //调用父类中的该方法 System.out.println("座位数:" + numOfSeat); } }
Object
ClassA
ClassB
ClassC
ClassB1
ClassB2
每个类最多只能有一个父类,只支持单继承; Object类是Java的终极超类,所有类都是Object类的直
接或间接子类。
子类继承沿继承路径向上的所有父类的有关属性和方法。
分析与讨论
衬衣与裙子类具有许 多相同的属性,能否 将它们看成一种继承
类成员的继承规则
分析讨论private成员的继承性;
分析讨论public成员的继承性; 问题:如果父类的public方法是用来操作父类的私 有变量呢?
分析讨论无访问控制符修饰的成员的继承性;
protected访问修饰符的使用 protected是专为继承而设计的访问控制修饰符
for循环
for 循环语句是当型结构,在几种循环语句的使用中最为
灵活,其语法格式如下:
for ([initialization];[loop-condition]; [iteration]){
body;
}
试一试: 编写使用for循环语句实现计算1到100的和的程序段。
do…while循环语句
方法覆盖(重写)
当从父类继承下来的方法不能完全满足子类需要时,我们可以重写 该方法。 如:Bus中从Vehicle类中继承下来的方法printInfo()不能输出 车的座位数。修改Bus如下:
class Bus extends Vehicle{ private int numOfSeat; public Bus(String type,String brand,double price,int
实战演练
1. 编写Employee类,该类包含: 四个受保护属性:雇员的姓名name、工号number、 住址address和薪水salary。 一个构造器方法:用于初始化name、number和 salary属性。 两个公有成员方法:分别实现职员基本信息的输出和 按比例涨工资的功能。
成员属性与成员方法的继承规则
父类
public
default
protected private
同一包中子类 public
default
protected 不被继承
Java成员继承规则
试一试: 编写Bus类的测试程序,参见P79-P80
分析: Bus类中有哪些成员变量与成员方法? 如果调用从父类继承下来的公有方法?举例说明?
子类构造器
子类构造器的一般形式 子类类名(构造器参数列表){ super(与父类构造器方法参数相对的实参); //①调用 父 类构造器 //②对子类成员的初始化 }
实战演练
1.编写一个矩形类Rect,该类包含: 两个私有属性:矩形的长length和宽width。 一个构造器方法:带2个参数的构造器方法,用于对 length和width属性进行初始化。 两个公有成员方法:分别用于计算并返回矩形的面积 和周长。