1、注意:开始用功了注意:开始用功了!第 1 页第1页配合例子源代码一起使用例子源代码一起使用Power point 制作:耿祥义 张跃平继承与接口继承与接口Java程序设计教学做一体化教程程序设计教学做一体化教程 第第5章章第2页主要内容主要内容第 3 页第3页5.1 子类子类 5.1.1关键知识关键知识 1子类定义子类定义 在类申明中在类申明中,经过使用关键字经过使用关键字extends来定义一个类子类来定义一个类子类,格式以下:格式以下:class 子类名子类名 extends 父类名父类名 比如:比如:class Student extends People 把把Student类定义为类定
2、义为People类子类、类子类、People类是类是Student类父类(超类)。类父类(超类)。2子类继承性子类继承性 假假如如子子类类与与父父类类在在同同一一个个包包中中,那那么么,子子类类自自然然地地继继承承了了父父类类中中不不是是private组组员员变变量量作作为为自自己己组组员员变变量量,而而且且也也自自然然地地继继承承了了父父类类中中不不是是private方方法作为自己方法,继承组员变量或方法访问权限保持不变。法作为自己方法,继承组员变量或方法访问权限保持不变。当当子子类类与与父父类类不不在在同同一一个个包包中中时时,子子类类只只继继承承父父类类中中protected和和publ
3、ic访访问问权权限限组组员员变变量量作作为为子子类类组组员员变变量量;一一样样,子子类类只只继继承承父父类类中中protected和和public访问权限方法作为子类方法。访问权限方法作为子类方法。第 4 页第4页 5.1.2 能力目标能力目标 能能定定义义子子类类,并并知知道道子子类类那那些些组组员员变变量量或或方方法法是是从从父父类类继继承下来。承下来。第 5 页第5页 5.1.3 任务驱动 将以下将以下Application.5_1java中中【代码代码】替换为程序代码。替换为程序代码。People.java Student.java UniverStudent.java Applica
4、tion5_1.java程序运行效果如图程序运行效果如图5.15.1。第 6 页第6页 任务小结任务小结 (1)继承是一个由已经有类创建新类机制。能够先定义一个共有属性普通类,依据该普通类再定义含有特殊属性子类,子类继承普通类属性和行为,并依据需要增加它自己新属性和行为,子类能够让程序无须一切“从头做起”。(2)instanceof运算符是Java独有双目运算符,其左面操作元是对象,右面操作元是类,当左面操作元是右面类或其子类所创建对象时,instanceof运算结果是true,不然是false。(3)假如一个类是另一个类子类,那么UML经过使用一个实线连接两个类UML图来表示二者之间继承关系
5、,实线起始端是子类UML图,终点端是父类UML图,但终点端使用一个空心三角形表示实线结束,如图5.2。第 7 页第7页 5.1.4 实践步骤 Application5_2.java 第 8 页第8页5.2 5.2 组员变量隐藏和方法重写组员变量隐藏和方法重写 5.2.1 关键知识关键知识1 1隐藏组员变量隐藏组员变量 假假如如子子类类申申明明组组员员变变量量名名字字和和从从父父类类继继承承下下来来组组员员变变量量名名字字相相同同(申申明明类类型型能能够够不不一一样样),在在这这种种情情况况下下,子子类类就会隐藏掉所继承组员变量。就会隐藏掉所继承组员变量。子子类类一一旦旦隐隐藏藏了了继继承承组组
6、员员变变量量,那那么么子子类类对对象象以以及及子子类类自自己己定定义义方方法法操操作作与与父父类类同同名名组组员员变变量量时时,就就是是操操作作子子类重新申明这个组员变量。类重新申明这个组员变量。2 2方法重写(方法重写(OverrideOverride)假假如如子子类类能能够够继继承承父父类类某某个个方方法法,那那么么子子类类就就有有权权利利重写这个方法。重写这个方法。第 9 页第9页 5.2.2 能力目标能力目标 子类经过重写方法,改变继承行为。第 10 页第10页 5.2.3 任务驱动将将以以下下University.java和和ImportantUniversity.java中中【代代
7、码码】替换为程序代码。替换为程序代码。Application5_3.java 程序运行效果如图程序运行效果如图5.35.3。第 11 页第11页 任务任务 小结小结重写方法既能够操作继承组员变量、调用继承方法,也能够操作子类新申明组员变量、调用新定义其它方法,但无法操作被子类隐藏组员变量和方法。需要尤其注意是,子类在重写父类方法时,不能够降低方法访问权限(访问权限从高到低排列次序是:public、protected、友好、private.第 12 页第12页 5.2.4 实践步骤 Application5_4.java 第 13 页第13页5.3 5.3 super关键字关键字 5.3.1 关
8、键知识关键知识_11用super操作被隐藏组员变量和方法 子类一旦隐藏了继承组员变量,那么子类创建对象就不再拥有该变量,该变量将归关键字super所拥有,一样子类一旦隐藏了继承方法,那么子类创建对象就不能调用被隐藏方法,该方法调用由关键字super负责。2使用super调用父类结构方法 当用子类结构方法创建一个子类对象时,子类结构方法总是先调用父类某个结构方法,也就是说,假如子类结构方法没有显著地指明使用父类哪个结构方法,子类就调用父类不带参数结构方法。子类在其结构方法中需使用super来调用父类结构方法,而且super必须是子类结构方法中头一条语句,即假如在子类结构方法中,没有显著地写出su
9、per关键字来调用父类某个结构方法,那么默认地有:super();第 14 页第14页 5.3.1 关键知识关键知识 _2class Student int number;Student()Student(int number)this.number=number;class UniverStudent extends Student boolean isMerried;UniverStudent(int number,boolean b)super(number);/调用父类结构方法Student(int number)isMerried=b;第 15 页第15页 5.3.2 能力目标能力目
10、标 在子类中使用super关键字调用被隐藏(覆盖)方法。第 16 页第16页 5.3.3 任务驱动将以下将以下 BeijingWaterUser.java中中【代码代码】替换为程序代码。替换为程序代码。WaterUser.java 和和 Application5_5.java 程序运行效果如图程序运行效果如图5.45.4。第 17 页第17页 任务任务 小结小结(1)当super调用被隐藏方法时,该方法中出现组员变量就是被子类隐藏组员变量或继承组员变量。(2)假如类里定义了一个或多个结构方法,那么Java不提供默认结构方法(不带参数结构方法),所以,当在父类中定义多个结构方法时,应该包含一个不
11、带参数结构方法,以防子类省略super时出现错误。第 18 页第18页 5.3.4 实践步骤 Application5_6.java第 19 页第19页5.4 5.4 final关键字 5.4.1 关键知识关键知识 final关键字能够修饰类、组员变量和方法中局部变量。1final类 能够使用final将类申明为final类。final类不能被继承,即不能有子类。final class A 2final方法 假如用final修饰父类中一个方法,那么这个方法不允许子类重写。3常量 假如组员变量或局部变量被修饰为final,就是常量。第 20 页第20页 5.4.2 能力目标能力目标 掌握fina
12、l关键字使用方法。第 21 页第21页 5.4.3 任务驱动将Circle.java中【代码】替换为程序代码。Application5_7.java 程序运行效果如图程序运行效果如图5.55.5。第 22 页第22页 任务任务 小结小结 final参数能够接收所传递值,但在方法内不允许对final参数进行写操作,即参数得到值之后,就按常量对待final参数 第 23 页第23页 5.4.4 实践步骤 A.java第 24 页第24页5.5 5.5 对象上转型对象 5.5.1 关键知识关键知识 1上转型对象上转型对象 假设People类是American类父类,当用子类创建一个对象,并把这个对象
13、引用放到父类对象中时,比如:2上转型对象特征1)上转型对象不能操作子类新增组员变量;不能调用子类新增方法。2)上转型对象能够访问子类继承或隐藏组员变量,也能够调用子类继承方法或子类重写实例方法。People person;person=new American();或People person;American anAmerican=new American();person=anAmerican;这时,称对象person是对象anAmerican上转型对象。第 25 页第25页 5 5.5.2 能力目标能力目标 掌握怎样使用上转型对象调用子类重写实例方法 第 26 页第26页 5.5.3 任
14、务驱动将以下Application5_8.java中【代码】替换为程序代码。程序运行效果如图程序运行效果如图5.75.7。People.java ChinaPeople.java AmericanPeople.java 第 27 页第27页 任务任务 小结小结(1)在 Aplication类 main方 法 中,不 能 让 上 转 型 对 象 people调 用 speakChinese()或void speakEnglish(),因为这两个方法不是子类继承或重写方法,而是子类新增方法。(2)假如子类重写了父类静态方法(static修饰方法),那么子类对象上转型对象不能调用子类重写静态方法,只
15、能调用父类静态方法。第 28 页第28页 5.5.4 实践步骤 上机调试以下代码,尤其注意程序输出结果。上机调试以下代码,尤其注意程序输出结果。Application5_9.java 第 29 页第29页5.6 5.6 多态和抽象类 5.6.1 关键知识关键知识1多态性多态性 多多态态性性就就是是指指父父类类某某个个方方法法被被其其子子类类重重写写时时,能能够够各各自自产产生生自自己己功功效效行行为为,也就是说一个类不一样子类在重写方法时能够各自产生适合其子类对象行为。也就是说一个类不一样子类在重写方法时能够各自产生适合其子类对象行为。2用上转型对象表达多态用上转型对象表达多态 上上转转型型对
16、对象象在在调调用用子子类类重重写写方方法法时时就就可可能能含含有有各各种种形形态态,因因为为不不一一样样子子类类在重写父类方法时可能产生不一样行为。在重写父类方法时可能产生不一样行为。3抽象类及抽象方法抽象类及抽象方法 用关键字用关键字abstract修饰类称为修饰类称为abstract类(抽象类)。如:类(抽象类)。如:abstract class A 用关键字用关键字abstract修饰方法称为修饰方法称为abstract方法(抽象方法)方法(抽象方法).1)1)和普通类相比和普通类相比,abstractabstract类中能够有类中能够有abstractabstract方法方法,也能够有
17、非也能够有非abstractabstract方法。方法。2)2)对对于于abstractabstract类类,不不能能使使用用newnew运运算算符符创创建建该该类类对对象象。假假如如一一个个非非抽抽象象类类是是某个抽象类子类,那么它必须重写父类抽象方法,给出方法体。某个抽象类子类,那么它必须重写父类抽象方法,给出方法体。3)3)能能够够使使用用abstractabstract类类申申明明对对象象,尽尽管管不不能能使使用用newnew运运算算符符创创建建该该对对象象,但但该该对对象能够成为其子类对象上转型对象,那么该对象就能够调用子类重写方法象能够成为其子类对象上转型对象,那么该对象就能够调用
18、子类重写方法第 30 页第30页 5.6.2 能力目标能力目标 掌握用抽象类对象做上转型对象,并表达子类多态掌握用抽象类对象做上转型对象,并表达子类多态。第 31 页第31页 5.6.3 任务驱动将以下Application5_10.java中【代码】替换为程序代码。Animal.java Dog.java Cat.java 程序运行效果如图程序运行效果如图5.85.8。第 32 页第32页 任务任务 小结小结 当用上转型对象调用子类重写方法时,含有很好通用性,因为程序无须关心子类详细对象名字,就能够让上转型对象调用子类体重写方法。不允许使用static修饰abstract方法,即abstra
19、ct方法必须是实例方法。不允许使用final修饰abstract类,即要允许abstract类有子类 第 33 页第33页 5.6.4 实践步骤 上上机机调调试试以以下下代代码码,注注意意对对象象car是是哪哪些些对对象象上上转转性性对对象象,并并怎样表达多态怎样表达多态。Application5_11.java第 34 页第34页5.7 5.7 接口与实现接口与实现 5.7.1 关键知识关键知识_11接口定义接口定义 使使用用关关键键字字interface来来定定义义一一个个接接口口。接接口口定定义义和和类类定定义义很很相相同同,分分为为接接口口申明和接口体,比如:申明和接口体,比如:int
20、erface Printable public final static int MAX=100;public abstract void add();public abstract float sum(float x,float y);接口使用关键字接口使用关键字interface来申明自己是一个接口来申明自己是一个接口,格式格式:interface 接口名字接口名字 接口体中包含常量申明和抽象方法两部分。接口体中包含常量申明和抽象方法两部分。接口体中全部常量访问权限一定都是接口体中全部常量访问权限一定都是public,而且是而且是static常量。常量。全部抽象方法访问权限一定都是全部抽象
21、方法访问权限一定都是public,如:,如:interface Printable int MAX=100;/等价于public final static int MAX=100;void add();/等价于public abstract void add();float sum(float x,float y);/等价于public abstract float sum(float x,float y);第 35 页第35页 5.7.1 关键知识关键知识 _22实现接口实现接口 接接口口由由类类来来实实现现,即即由由类类来来重重写写接接口口中中方方法法。一一个个类类能能够够在在类类申申明明
22、中中使使用用关关键键字字implements申申明明实实现现一一个个或或多多个个接接口口。假假如如类类实实现现多多个个接接口口,用用逗逗号号隔隔开开接接口口名名,如如A类类实实现现Printable和和Addable接口:接口:class A implements Printable,Addable 假假如如一一个个非非抽抽象象类类实实现现了了某某个个接接口口,那那么么这这个个类类必必须须重重写写这这个个接口中全部方法。接口中全部方法。需需要要注注意意是是,因因为为接接口口中中方方法法一一定定是是public abstract方方法法,所所以以类类在在重重写写接接口口方方法法时时不不但但要要去
23、去掉掉abstract修修饰饰符符、给给出出方方法法体体,而且方法访问权限一定要显著地用而且方法访问权限一定要显著地用public来修饰。来修饰。第 36 页第36页 5.7.2 能力目标能力目标 握类怎样实现接口。第 37 页第37页 5.7.3 任务驱动将以下Application5_12.java 中【代码】替换为程序代码 程程序运行效果如图序运行效果如图5.95.9第 38 页第38页 任务任务 小结小结接口思想在于它能够要求一些类有相同名称方法,但方法详细内容能够不一样,即要求这些类实现接口,以确保这些类一定有接口中所申明方法(即所谓方法绑定)。接口在要求一些类有相同名称方法同时,并
24、不强迫这些类含有相同父类。第 39 页第39页 5.7.4 实践步骤 第 40 页第40页5.8 5.8 接口回调接口回调 5.8.1 关键知识关键知识 1接口变量接口变量 接接口口也也是是Java中中一一个个主主要要数数据据类类型型,用用接接口口申申明明变变量量称称为为接接口变量。口变量。接接口口变变量量中中能能够够存存放放实实现现该该接接口口类类实实例例引引用用,即即存存放放对对象象引引用。用。接接口口回回调调就就是是指指:能能够够把把实实现现某某一一接接口口类类创创建建对对象象引引用用赋赋给给该该接接口口申申明明接接口口变变量量中中,那那么么该该接接口口变变量量就就能能够够调调用用被被类
25、类实实现现接接口口方方法法。实实际际上上,当当接接口口变变量量调调用用被被类类实实现现接接口口方方法法时时,就就是是通通知对应对象调用这个方法。知对应对象调用这个方法。2接口与多态接口与多态 把把实实现现接接口口类类实实例例引引用用赋赋值值给给接接口口变变量量后后,该该接接口口变变量量就就能能够回调类重写接口方法。够回调类重写接口方法。由由接接口口产产生生多多态态就就是是指指不不一一样样类类在在实实现现同同一一个个接接口口时时可可能能含含有有不不一一样样实实现现方方式式,那那么么接接口口变变量量在在回回调调接接口口方方法法时时就就可可能能含含有有各种形态。各种形态。第 41 页第41页 5.8
26、.2 能力目标能力目标 使用接口变量调用类实现接口方法,即掌握接口回调技术。第 42 页第42页 5.8.3 任务驱动将以下Application5_13.java中【代码】替换为程序代码。Sound.javaSound.java SoundMachine.javaSoundMachine.java Piano.javaPiano.java Violin.javaViolin.java 程序运行效果如图程序运行效果如图5.115.11。第 43 页第43页 任务任务 小结小结(1)使用接口能够让程序愈加轻易维护和扩展,比如,在任 务 模 版 中,再 增 加 实 现 Sound接 口 类 时,不
27、 需 要 修 改SoundMachine类代码。(2)在设计程序时应该依据详细情况来确定是使用抽象类还是接口。第 44 页第44页 5.8.4 实践步骤 上机调试以下程序,注意接口回调是怎样表达多态。上机调试以下程序,注意接口回调是怎样表达多态。Application5_14.java 第 45 页第45页5.9 5.9 匿名类匿名类 5.9.1 关键知识关键知识_1 1内部类内部类 能能够够在在一一个个类类中中再再定定义义另另一一个个类类,这这么么类类称称作作当当前前类类中中内内部部类类,而而包包含含内内部部类类类类称称为为内内部部类类外外嵌嵌类类。内内部部类类外外嵌嵌类类组组员员变变量量在
28、在内内部部类类中中依依然然有有效效,内内部部类类中中方方法法也也能能够够调调用用外外嵌嵌类类中中方方法法。RedCowForm.java 内内部部类类类类体体中中不不能能够够申申明明类类变变量量和和类类方方法法。内内部部类类仅仅供供它它外外嵌嵌类类使使用用,其其它它类类不不能能够够用用某某个个类类内内部部类类申申明明对象。对象。class RedCowForm RedCow cow;/内部类申明对象cow RedCowForm()cow=new RedCow(150,112);public void showCowMess()cow.speak();class RedCow /内部类申明 St
29、ring cowName=红牛;int height,weight,price;RedCow(int h,int w)height=h;weight=w;void speak()System.out.println(高:+height+cm 重:+weight);/内部类结束第 46 页第46页 5.9.1 关键知识关键知识 _22匿名类与子类匿名类与子类 Java允允许许直直接接使使用用一一个个类类子子类类类类体体创创建建一一个个子子类类对对象象。比比如如,假假设设Bank是是一个类,那么以下代码就是用一个类,那么以下代码就是用Bank一个子类创建对象:一个子类创建对象:new Bank()
30、匿名类类体 ;使使用用匿匿名名类类时时,必必定定是是在在某某个个类类中中直直接接用用匿匿名名类类创创建建对对象象,所所以以匿匿名名类类一一定是内部类。定是内部类。假假如如某某个个方方法法参参数数是是Bank类类型型,那那么么经经常常使使用用匿匿名名类类创创建建一一个个对对象象,并并将将对象引用传递给方法参数。比如,对于对象引用传递给方法参数。比如,对于 void showMoney(Bank bank)其其中中参参数数bank是是Bank类类型型,那那么么在在调调用用showMoney时时,能能够够向向showMoney方方法法参数参数bank传递一个匿名类(传递一个匿名类(Bank一个子类)
31、对象,比如:一个子类)对象,比如:void showMoney(new Bank()Bank类子类类体 )/注意这里最终右小括号注意:方法中参数是匿名类创建一个对象注意:方法中参数是匿名类创建一个对象.第 47 页第47页 5.9.2 能力目标能力目标 掌握怎样向方法参数传递一个匿名类对象引用。第 48 页第48页 5.9.3 任务驱动将以下Application5_15.java中【代码】替换为程序代码.OutputAlphabet.java ShowBoard.java 程序运行效果如图程序运行效果如图5.125.12。第 49 页第49页 任务任务 小结小结 因为匿名类是一个子类,但没有
32、类名,所以在用匿名类创建对象时,要直接使用父类不带参数结构方法。第 50 页第50页 5.9.4 实践步骤 上机调试以下程序,注意匿名类使用方法。上机调试以下程序,注意匿名类使用方法。Application5_16.java第 51 页第51页5.10 5.10 小结小结 1.子类继承方法只能操作子类继承和隐藏组员变量。2.子类重写或新增方法能操作子类继承和新申明组员变量,但不能直接操作隐藏组员变量。3.上转型对象能够访问子类继承或隐藏组员变量,也能够调用子类继承方法或子类重写实例方法。4.接口接口体中只能够有常量和abstract方法。5.接口变量中只能存放实现该接口类实例(对象)引用。6.当接口变量中存放了实现接口类对象引用后,接口变量就能够调用类实现接口方法,这一过程被称为接口回调。“本节结束咯本节结束咯偶都会了偶都会了太葱明了太葱明了”第 52 页第52页第 53 页第53页