子类构造器与方法重写_第1页
子类构造器与方法重写_第2页
子类构造器与方法重写_第3页
子类构造器与方法重写_第4页
子类构造器与方法重写_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深圳职业技术学院深圳职业技术学院主讲教师:袁梅冷主讲教师:袁梅冷 2008-04-21电信学院电信学院-软件工程系软件工程系本单元教学内容 使用继承改善系统类的结构使用继承改善系统类的结构 类成员的继承规则类成员的继承规则 子类构造器子类构造器 子类对父类方法的重写子类对父类方法的重写汽车管理系统 系统是一个用于管理小轿车、客车等各类汽车系统是一个用于管理小轿车、客车等各类汽车资源的系统。资源的系统。 功能主要包括:维护、存储各类车的基本信息;功能主要包括:维护、存储各类车的基本信息;提供汽车信息列表输出等功能。提供汽车信息列表输出等功能。分析:针对系统要求,应设计哪些核心类?分析:针对系统要

2、求,应设计哪些核心类?汽车管理系统核心类 1.用于描述各种类型车信息的车类,如用于描述各种类型车信息的车类,如Car类、类、Bus类;类; 2.用于保存所有汽车基本信息的数据类。用于保存所有汽车基本信息的数据类。 分析:分析: 1。Car类与类与Bus类各有什么成员属性和方法?类各有什么成员属性和方法? 比较比较Car类与类与Bus类,发现什么异同?如果还需要其类,发现什么异同?如果还需要其它车类,怎么做?它车类,怎么做?VehicleData类 用于保存维护所有汽车基本信息; 分析分析VehicleData类 问题:问题: 1. 如何保存各类车信息?如何保存各类车信息? 2 .分析相关的分析

3、相关的add方法和方法和list方法,比较异同。方法,比较异同。ArrayList类的使用 ArrayList类封装了一个类封装了一个Object类型的数组,我类型的数组,我们可以使用它来维护一个们可以使用它来维护一个Object的可变长数组。的可变长数组。 ArrayList对象的创建对象的创建 public ArrayList():默认的构造器,将会以默认大小默认的构造器,将会以默认大小(16)来初始化内部的数组。)来初始化内部的数组。 public ArrayList(int initialCapacity):用指定的大:用指定的大小来初始化内部的数组。小来初始化内部的数组。 publi

4、c ArrayList(Collection c):用一个已有集合对:用一个已有集合对象来构造数组,并将该集合的元素添加到象来构造数组,并将该集合的元素添加到ArrayList的数组中。的数组中。ArrayList类的使用 ArrayList类的部分常用方法类的部分常用方法 add(Object o):在对象列表结构的最后添加对象元素。 add(int index, Object element):在对象列表指定位置插入新的对象元素。 remove(Object o) :从对象列表中移走对象。 clear():清空列表中的所有对象元素。 iterator():返回用于遍历对象集合的指针。 Ja

5、va的循环控制结构 Java的循环语句共有三种,它们是:的循环语句共有三种,它们是: while 循环语句 for 循环语句 dowhile循环语句。 循环结构由四个部分组成。循环结构由四个部分组成。 初始化部分初始化部分(initialization):一条或多条语句,用来做一些初始化的工作。 循环条件部分循环条件部分(loop-condition):一个boolean型的表达式,根据它的值来判断是否继续下一次循环。 循环体部分循环体部分(body):将被反复执行的代码,可以是一条语句,也可以是一个语句块(复合语句)。 迭代部分迭代部分(iteration):在一次循环结束后,下一次循环开始

6、前执行的语句,通常用于修改循环条件。Java的循环控制结构while和和for循环语句对应当型结构,循环语句对应当型结构,dowhile语句语句对应直到型结构。对应直到型结构。初 始 化循 环 条 件循 环 体迭 代 部 分truefalse初始化循环条件循环体迭代部分truefalse当型循环结构 直到型循环结构While循环while的语法格式如下:的语法格式如下:initializationwhile (loop-condition)body;iteration;试一试:试一试:请分析下面程序段的功能,绘制其流程图,并加以解释。int count=1; /定义并初始化循环变量Iint s

7、um=0; /定义并初始化求和结果变量sumwhile(count=100) /循环求和sum+=count; /循环体count+;System.out.println(“1+2+.+100=”+sum);/输出结果for循环 for 循环语句是当型结构,在几种循环语句的使循环语句是当型结构,在几种循环语句的使用中最为灵活,其语法格式如下:用中最为灵活,其语法格式如下: for (initialization;loop-condition; iteration) body; 试一试:试一试: 编写使用编写使用for循环语句实现计算循环语句实现计算1到到100的和的程序段。的和的程序段。dow

8、hile循环语句 do-while 循环语句是直到型结构,它的语法格循环语句是直到型结构,它的语法格式如下:式如下: initialization do body; iteration; while (loop-condition); 试一试:试一试: 编写使用编写使用do-while循环语句实现计算循环语句实现计算1到到100的和的程的和的程序段。序段。改善系统类结构如何有效减少如何有效减少Car类和类和Bus类代码的重复?类代码的重复?观察下图观察下图基本思路:基本思路: 将将Car类与类与Bus类的共性抽象出来,上移到类的共性抽象出来,上移到Vehicle类中。类中。 以以Vehicle

9、类为基础,构建类为基础,构建Car类和类和Bus类。类。相关概念类的继承描述的是类与类之间的类的继承描述的是类与类之间的“is a ”关系,即子类是关系,即子类是比父类更为特殊的类,是父类的一种特例。继承机制的比父类更为特殊的类,是父类的一种特例。继承机制的优点在于为我们提供了一种类级的代码重用机制,使我优点在于为我们提供了一种类级的代码重用机制,使我们可以在现有类的基础上,通过重用、修改或添加等方们可以在现有类的基础上,通过重用、修改或添加等方法创建一个新类。法创建一个新类。父类(或基类、超类)子类(或派生类)继承的Java实现 编写例编写例3-3程序程序 在在Java中使用关键字中使用关键

10、字extends实现继承,其基实现继承,其基本语法格式为:本语法格式为:class SubClassName extends SupClassName 需要讨论二个问题:需要讨论二个问题: 1、子类中有什么?类成员的继承规则是怎样的?、子类中有什么?类成员的继承规则是怎样的? 2、在继承结构中,构造器是如何处理的?如何写子、在继承结构中,构造器是如何处理的?如何写子类构造器方法。类构造器方法。类成员的继承规则 分析讨论分析讨论private成员的继承性;成员的继承性; 分析讨论分析讨论public成员的继承性;成员的继承性; 问题:问题:如果父类的如果父类的public方法是用来操作父类的私方

11、法是用来操作父类的私有变量呢?有变量呢? 分析讨论无访问控制符修饰的成员的继承性;分析讨论无访问控制符修饰的成员的继承性; protected访问修饰符的使用访问修饰符的使用 protected是专为继承而设计的访问控制修饰符是专为继承而设计的访问控制修饰符成员属性与成员方法的继承规则父类 publicdefaultprotectedprivate同一包中子类publicdefaultprotected不被继承Java成员继承规则 试一试:试一试: 编写编写Bus类的测试程序,参见类的测试程序,参见P79P80 分析:分析: Bus类中有哪些成员变量与成员方法?类中有哪些成员变量与成员方法?

12、如果调用从父类继承下来的公有方法?举例说明?如果调用从父类继承下来的公有方法?举例说明?子类构造器 重新思考:重新思考: 构造器的形式要求? 构造器的作用? 观察分析:观察分析: Bus类与Car类构造器方法 理解子类构造器理解子类构造器 在内存机制中,子类对象的属性包含从父类继承下来的属性和自己新增的属性,因此,构建对象时,也要先构建父类的数据部分,再考虑子类增加的部分。子类构造器 子类构造器的一般形式子类构造器的一般形式子类类名(构造器参数列表)super(与父类构造器方法参数相对的实参); /调用父 类构造器/对子类成员的初始化实战演练 1编写一个矩形类编写一个矩形类Rect,该类包含:

13、,该类包含: 两个私有属性:矩形的长length和宽width。 一个构造器方法:带2个参数的构造器方法,用于对length和width属性进行初始化。 两个公有成员方法:分别用于计算并返回矩形的面积和周长。实战演练 2编写一个具有确定位置的矩形类编写一个具有确定位置的矩形类PlainRect,该类继承于该类继承于Rect类,其确定位置用矩形的左上类,其确定位置用矩形的左上角坐标来标识,为该类添加:角坐标来标识,为该类添加: 两个属性:矩形左上角坐标startX和startY。 两个构造器方法: (1)带4个参数的构造器方法,用于对startX、startY、width和height属性初始化

14、; (2)不带参数的构造器方法,将矩形初始化为左上角坐标、长和宽都为0的矩形; 一个方法:方法isInside(double x,double y)。用于判断某个点是否在矩形内部,如在矩形内,返回true, 否则,返回false。实战演练 3编写上题编写上题PlainRect类的测试程序类的测试程序 (1)创建一个左上角坐标为(10,10),长为20,宽为10的矩形对象; (2)计算并打印输出矩形的面积和周长; (3)判断点(25.5,13)是否在矩形内,并打印输出相关信息。方法覆盖(重写)当从父类继承下来的方法不能完全满足子类需要时,我们可以重写当从父类继承下来的方法不能完全满足子类需要时,

15、我们可以重写该方法。该方法。 如:如:Bus中从中从Vehicle类中继承下来的方法类中继承下来的方法printInfo()不能输出车的座位不能输出车的座位数。修改数。修改Bus如下:如下:class Bus extends Vehicle private int numOfSeat; public Bus(String type,String brand,double price,int numOfSeat) super(type,brand,price); this.numOfSeat=numOfSeat; public void printInfo() /重写父类中的重写父类中的prin

16、tInfo()方法()方法 super.printInfo(); /调用父类中的该方法调用父类中的该方法 System.out.println(座位数座位数: + numOfSeat); 方法覆盖(重写) 重新运行重新运行Bus类的测试程序类的测试程序P79-P80 方法覆盖与方法重载的区别。方法覆盖与方法重载的区别。 方法重载要求:方法名相同,参数数目或参数类型不同; 方法覆盖要求:子类的方法定义应与父类保持一致。即应与父类有完全相同的方法名、返回值类型和参数列表,否则就不是方法的覆盖,而是在子类中定义了自己的与父类无关的成员方法,此外,方法的覆盖还应遵循以下规则: 覆盖方法的访问控制应该与

17、它所覆盖的方法的访问控制相同或更宽松; 覆盖方法不能比它所覆盖的方法抛出更多的异常。试一试对于以下的类对于以下的类BaseClass和子类和子类Subclassclass BaseClass private float x = 1.0f ; protected float getVar ( ) ( return x;) class Subclass extends BaseClass private float x = 2.0f; /方法插入处方法插入处以下哪些方法是方法以下哪些方法是方法getVar()的重写方法:(的重写方法:( )A. float getVar ( ) return x;

18、 B. public float getVar ( ) return x; C. float double getVar ( ) return x; D. protected float getVar ( ) return x; E. public float getVar (float f ) return f;试一试 14对于以下给定的类:对于以下给定的类:public class MethodOver public void setVar (int a, int b, float c) 下面哪些方法是方法下面哪些方法是方法setVar (int a, int b, float c)的重载

19、方法?(的重载方法?( )A.private void setVar (int a, float c, int b) B.protected void setVar (int a, int b, float c) C.public int setVar (int a, float c, int b) (return a;) D.public int setVar (int a, int b, float c) (return a;) E.protected float setVar (int a, int b, float c) (return c;) 变量的隐藏class SuperClas

20、sprivate int value=10;public void printValue() System.out.println(value=+value); class DeriveClass extends SuperClassprivate int value=20;实战演练 1 编写编写Employee类,该类包含:类,该类包含: 四个受保护属性:雇员的姓名name、工号number、住址address和薪水salary。 一个构造器方法:用于初始化name、number和salary属性。 两个公有成员方法:分别实现职员基本信息的输出和按比例涨工资的功能。实战演练 2编写编写Man

21、ager类,该类继承于类,该类继承于Employee类类 (1)为其添加: 两个属性:办公室officeID和年终分红bonus; 一个构造器方法:带有4个参数的构造器方法,用于对除bonus属性外的所有其它属性进行初始化; 方法:officeID属性和bonus属性的相关set和get方法; (2)重写Employee类中的方法raiseSalary(double proportion),经理涨工资的计算方法为在雇员工资涨幅的基础上增加10%的比例。实战演练 3编写编写TemporaryEmployee(临时工)类,(临时工)类,该类继承于该类继承于Employee类类 (1)为其添加: 一个属性:雇佣年限hireYears; 构造器方法:用于初始化该类的所有属性; 方法:hireYears属性的set和get方法; (2)重写Employee类中的方法raiseSalary(double prop

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论