收藏 分享(赏)

JAVA程序设计(第五章 子类与继承).pptx

上传人:hwpkd79526 文档编号:8315623 上传时间:2019-06-20 格式:PPTX 页数:41 大小:284.80KB
下载 相关 举报
JAVA程序设计(第五章 子类与继承).pptx_第1页
第1页 / 共41页
JAVA程序设计(第五章 子类与继承).pptx_第2页
第2页 / 共41页
JAVA程序设计(第五章 子类与继承).pptx_第3页
第3页 / 共41页
JAVA程序设计(第五章 子类与继承).pptx_第4页
第4页 / 共41页
JAVA程序设计(第五章 子类与继承).pptx_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、,JAVA程序设计,Java2 实用教程(第四版) 陈艳,1,第五章 子类与继承,子类与父类 子类的继承性 子类与对象 成员变量的隐藏和方法重写 super关键字 final关键字类,对象的上转型对象 继承与多态 abstract类与abstract方法 面向抽象编程 开-闭原则,2,子类与父类,用extends来定义一个子类: class 子类名 extends 父类名 class Student extends People ,3,子类与父类,4,类的树形结构,任何类都是Object的子孙类 每个类有且仅有一个父类 一个类可有多个子类 一个类的定义中无extends,则默认是Object的

2、子类,子类的继承性,5,子类和父类在同一个包中的继承性 子类继承其父类中不是private的成员变量和成员方法作为自己的成员变量和成员方法,继承的成员变量和成员方法访问权限保持不变 例1:所有的类都在无名包中 Example5_1 People Student UniverStudent,子类的继承性,6,子类和父类不在同一个包中的继承性 子类只继承父类中的protected和public访问权限的成员变量和成员方法 父类中的private和友好访问权限的成员变量和成员方法不被继承,子类的继承性,7,protected的进一步说明 类A中的protected成员变量和方法可以被它的子孙类继承

3、如果在类D中创建了D本身的对象,那么该对象可以通过“.”运算符访问继承的或自己的protected变量和方法,子类的继承性,8,protected的进一步说明 在Other类中创建了D类的对象obj,则protected的成员变量和成员方法权限如下: 只要Other类和D类在同一个包中,obj对象可以访问D类自己声明的protected成员变量和方法 对于子类D从父类继承的protected成员变量和方法,需要追溯这些protected成员变量或方法的祖先,如A类,只要Other类和A类在同一个包中,obj对象能访问继承的protected成员变量和方法,子类与对象,9,子类对象的特点 子类不

4、继承父类的private成员变量 如果子类和父类不在同一个包中,子类不继承父类的友好成员变量 子类从父类继承过来的方法可以操作上述这两部分未被继承的变量例2,子类与对象,10,关于instanceof运算符 当左边的操作元是右边的类或其子类所创建的对象时,instanceof运算结果为true,否则为false kate instanceof student kate instanceof People mike instanceof People mike instanceof student mike instanceof UniverStudent kate instanceof Uni

5、verStudent,kate,mike,ture,false,成员变量的隐藏和方法的重写,11,成员变量的隐藏 当子类中定了和父类中同名的成员变量(类型可以不同),父类中的成员变量在子类中被隐藏 子类对象及子类自己定义的方法中操作与父类同名的成员变量时,实际上操作的是子类自己定义的这个成员变量 子类继承的方法操作的成员变量是被子类隐藏的父类的成员变量例3 Example5_3 CheapGoods Goods,成员变量的隐藏和方法的重写,12,方法重写 子类中定义和父类同名的方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型(如,父类方法的类型为类A,那么允许子类的重写

6、的方法的类型是A的子类),且方法名、参数个数、参数的类型和父类的方法完全相同,子类如此定义的方法称作子类重写的方法,成员变量的隐藏和方法的重写,13,方法重写 如果父类的方法f()被子类重写,子类就隐藏了父类的f()方法,则子类对象调用的f()方法是子类重写的f()方法 子类重写的方法可以调用从父类继承的成员变量和成员方法,也可以操作子类新声明的成员变量和方法,但无法操作被子类隐藏的父类的成员变量和方法例4 Example5_4 University ImportantUniversity 例5,成员变量的隐藏和方法的重写,14,方法重写 例5中若将computer()方法的返回类型改为dou

7、ble将产生编译错误,原因: 不是重写了父类的computer()方法 类中不能同时存在两个方法名相同、参数也相同,但返回值不同的同名方法,不符合重载的语法规则,成员变量的隐藏和方法的重写,15,方法重写 重写父类方法时,不能降低方法的访问权限,可以提高访问权限,class Aprotected float f(float x,float y)return x-y; class B extends A/非法,降低了访问权限float f(float x,float y) return x+y; class C extends A/合法,提高了访问权限public float f(float x

8、,float y) return x*y; ,成员变量的隐藏和方法的重写,16,方法重写 允许重写方法的类型可以是父类方法类型的子类型例6,super关键字,17,用super操作被隐藏的成员变量和成员方法 如果在子类中想使用被子类隐藏的成员变量或方法需要使用super关键字例7,super关键字,18,用super调用父类的构造方法 当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法没有明显的指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法 子类不继承父类的构造方法,故在子类的构造方法中需用super来调用父类的构造方法,且s

9、uper必须是子类构造方法中的第一条语句,super关键字,19,用super调用父类的构造方法 如果在子类的构造方法中未明显的写成super关键字来调用父类的某个构造方法,则默认有: super(); 当父类中定义了多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误例8,final关键字,final关键字可以修饰类、方法、成员变量和方法中的局部变量。 final类final类不能被继承,即不能有子类。如:final class A ,20,final关键字,final方法 如果用final修饰父类中的一个方法,那么这个方法不允许子类重写。 常量 如果成员变量或局

10、部变量被修饰为final的,就是常量 例9,21,对象的上转型对象,假设,A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,比如:,22,A a; a=new B();或 A a; B b=new B(); a=b;,这时,称对象a是对象b的上转型对象。,Animal a; Tiger b=new Tiger (); a=b;,a是对象b的上转型对象,好比“老虎是动物”,对象的上转型对象,上转型对象不能操作子类新增的成员变量;不能调用子类新增的方法。 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。 如果子类重写了父类的某个

11、实例方法后,当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法。,23,对象的上转型对象,24,对象的上转型对象,注意: 不要将父类创建的对象和子类对象的上转型对象混淆; 可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有的属性和功能; 不可以将父类创建的对象的引用赋值给子类声明的对象例10,25,继承与多态,多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为例11,26,abstract类和abstract方法,用关键字abstract修饰的类称为abstract类(抽象类)。如:abstract class A 用关键字abs

12、tract修饰的方法称为abstract方法(抽象方法),例如:abstract int min(int x,int y); /无方法体,27,abstract类和abstract方法,注意2点: 不允许使用final和abstract同时修饰一个方法或类 不允许使用static修饰abstract方法 abstract类中可以有abstract方法,也可以有非abstract方法(非abstract类中不可以有abstract方法) abstract class Aabstract int min(int x,int y);int max(int x,int y)return xy?x:y;

13、 ,28,abstract类和abstract方法,abstract类不能用new运算符创建对象 如果一个非抽象类是抽象类的子类,则它必须重写父类的抽象方法 abstract类的对象作上转型对象 可以使用abstract类声明对象,该对象可以成为子类的上转型对象 注意2点: abstract类可以没有abstract方法 如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法 例12,29,面向抽象编程,在设计一个程序时,可以通过在abstract类中声明若干个abstract方法,表明这些方法在整个系统设计中的重要性,

14、方法体的内容细节由它的非abstract子类去完成。 使用多态进行程序设计的核心技术之一是使用上转型对象,即将abstract类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法。,30,面向抽象编程,所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。,31,public class Pillar Circle bottom;double height;Pillar (Circle bottom,double height) this.bottom=bottom; this

15、.height=height;public double getVolume() return bottom.getArea()*height; /bottom可以调用子类重写的getArea方法 ,public class Circle double r;Circle(double r) this.r=r;public double getArea() return(3.14*r*r); ,面向抽象编程,面向抽象编程的目的是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去,让类中每种可能的变化对应的交给抽象类的一个子类去负责,从而让该类的设计不去关心具体的实现

16、 例13 Pillar,32,面向抽象编程,33,开-闭原则:对扩展开放,对修改关闭,实验1:中国人、北京人和美国人,编写程序模拟中国人、美国人是人,北京人是中国人。除了主类外,程序中还有4个类People、ChinaPeople、AmericanPeople和BeijingPeople类。要求如下: People类有权限是protected的double型成员变量height和weight,以及public void speakHello(),public void averageHeight()和public void averageWeight()方法。 ChinaPeople类是Peo

17、ple的子类,新增了public void chinaGongfu()方法。要求ChinaPeople重写父类的public void speakHello()、public void averageHeight()和public void averageWeight()方法。,34,实验1:中国人、北京人和美国人,AmericanPeople类是People的子类,新增public void americanBoxing()方法。要求AmericanPeople重写父类的public void speakHello()、public void averageHeight()和public v

18、oid averageWeight()方法。 BeijingPeople类是ChinaPeople的子类,新增public void beijingOpera()方法。要求ChinaPeople重写父类的public void averageHeight()和public void averageWeight()方法。 主类Example负责输出中国人、美国人和北京人的打招呼(speakHello),平均体重(Weight)和平均身高(Height),以及中国功夫、北京功夫、美国拳击(Boxing)和北京脸谱(Opera)信息。,35,实验1:中国人、北京人和美国人,People、ChinaP

19、eople、AmericanPeople和BeijingPeople类的UML图如下,36,实验2:银行利息计算,假设银行Bank已经有了按整年year计算利息的一般方法,其中year只能取正整数。比如按整年计算的方法:double computerInterest()interest=year*0.35*savedMoney;return interest; 建设银行ConstructionBank是Bank的子类,准备隐藏继承的成员变量year,并重写计算利息的方法,即自己声明一个double型的year变量,比如,当year取值是5.216时,表示要计算5年零216天的利息,但希望首先按

20、银行Bank的方法computerInterest()计算出5整年的利息,然后再自己计算216天的利息。那么,建设银行就必须把5.216的整数部分赋给隐藏的year,并让super调用隐藏的、按整年计算利息的方法。,37,实验2:银行利息计算,主类SaveMoney负责计算8000元钱分别在建行和广州银行存8.236年(8年236天)的利息,并计算出此笔存款在两个银行产生的利息的差额,假设8年Bank的存款利率为0.05,不满一年建行和广州银行的存款利率分别为0.03和0.04 ConstructionBank、GuangZhouBank类的UML图如下:,38,实验3:公司支出的总薪水,要求

21、有一个abstract类,类名为Employee。Employee的子类YearWorker、MonthWorker、WeekWorker。YearWorker对象按年领取薪水(24000),MonthWorker按月领取薪水(12*3000),WeekWorker按周领取薪水(52*1000)。Employee类有一个abstract方法: public abstract earnings(); 子类必须重写父类的earnings()方法,给出各自领取报酬的具体方式。,39,实验3:公司支出的总薪水,有一个Company类,该类用Employee对象数组作为成员,Employee对象数组的单元可以是YearWorker对象的上转型对象、MonthWorker对象的上转型对象或WeekWorker对象的上转型对象。程序能输出Company对象一年需要支付的薪水总额。 主类CompanySalary负责对有30名雇员的公司(长度为30的Employee对象数组,数组下标能被3整除的享受年薪 ,除3余数为1的享受月薪,除3余数为2的享受周薪)计算公司需支付的薪水总额。,40,实验3:公司支出的总薪水,UML图如下,41,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报