《Java程序设计教学做一体化教程第5章继承与接口.ppt》由会员分享,可在线阅读,更多相关《Java程序设计教学做一体化教程第5章继承与接口.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、注意:开始用功了注意:开始用功了!配合例子源代码一起使用例子源代码一起使用Power point 制作:耿祥义 张跃平继承与接口继承与接口Java程序设计教学做一体化教程程序设计教学做一体化教程 第第5章章主要内容主要内容5.1 子类子类 核心知识核心知识 1子类的定义子类的定义 在类的声明中在类的声明中,通过使用关键字通过使用关键字extends来定义一个类的子类来定义一个类的子类,格式如下:格式如下:class 子类名子类名 extends 父类名父类名 例如:例如:class Student extends People 把把Student类定义为类定义为People类的子类、类的子类、
2、People类是类是Student类的父类(超类)。类的父类(超类)。2子类的继承性子类的继承性 如如果果子子类类与与父父类类在在同同一一个个包包中中,那那么么,子子类类自自然然地地继继承承了了父父类类中中不不是是private的的成成员员变变量量作作为为自自己己的的成成员员变变量量,并并且且也也自自然然地地继继承承了了父父类类中中不不是是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。当当子子类类与与父父类类不不在在同同一一个个包包中中时时,子子类类只只继继承承父父类类中中的的protected和和pu
3、blic访访问问权权限限的的成成员员变变量量作作为为子子类类的的成成员员变变量量;同同样样,子子类类只只继继承承父父类类中中的的protected和和public访问权限的方法作为子类的方法。访问权限的方法作为子类的方法。5.1.2 能力目标能力目标 能能定定义义子子类类,并并知知道道子子类类的的那那些些成成员员变变量量或或方方法法是是从从父父类类继承下来的。继承下来的。5.1.3 任务驱动 将下列中的将下列中的【代码代码】替换为程序代码。替换为程序代码。UniverStudent.java 程序运行效果如图。程序运行效果如图。任务小结任务小结 (1)继承是一种由已有的类创建新类的机制。可以先
4、定义一个共有属性的一般类,根据该一般类再定义具有特殊属性的子类,子类继承一般类的属性和行为,并根据需要增加它自己的新的属性和行为,子类可以让程序不必一切“从头做起”。(2)instanceof运算符是Java独有的双目运算符,其左面的操作元是对象,右面的操作元是类,当左面的操作元是右面的类或其子类所创建的对象时,instanceof运算的结果是true,否则是false。(3)如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束,如图5.2。5.1.4
5、 实践环节 5.2 5.2 成员变量的隐藏和方法重写成员变量的隐藏和方法重写 5.2.1 核心知识核心知识1 1隐藏成员变量隐藏成员变量 如如果果子子类类声声明明的的成成员员的的变变量量的的名名字字和和从从父父类类继继承承下下来来的的成成员员变变量量的的名名字字相相同同(声声明明的的类类型型可可以以不不同同),在在这这种种情情况下,子类就会隐藏掉所继承的成员变量。况下,子类就会隐藏掉所继承的成员变量。子子类类一一旦旦隐隐藏藏了了继继承承的的成成员员变变量量,那那么么子子类类对对象象以以及及子子类类自自己己定定义义的的方方法法操操作作与与父父类类同同名名的的成成员员变变量量时时,就就是是操作子类
6、重新声明的这个成员变量。操作子类重新声明的这个成员变量。2 2方法重写(方法重写(OverrideOverride)如如果果子子类类可可以以继继承承父父类类的的某某个个方方法法,那那么么子子类类就就有有权权利重写这个方法。利重写这个方法。5.2.2 能力目标能力目标 子类通过重写方法,改变继承的行为。5.2.3 任务驱动将将下下列列和和ImportantUniversity.java中中的的【代代码码】替替换换为为程程序序代码。代码。程序运行效果如图。程序运行效果如图。任务任务 小结小结重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无
7、法操作被子类隐藏的成员变量和方法。需要特别注意的是,子类在重写父类的方法时,不可以降低方法的访问权限(访问权限从高到低的排列顺序是:public、protected、友好的、private.5.2.4 实践环节 5.3 5.3 super关键字关键字 5.3.1 核心知识核心知识_11用super操作被隐藏的成员变量和方法 子类一旦隐藏了继承的成员变量,那么子类创建的对象就不再拥有该变量,该变量将归关键字super所拥有,同样子类一旦隐藏了继承的方法,那么子类创建的对象就不能调用被隐藏的方法,该方法的调用由关键字super负责。2使用super调用父类的构造方法 当用子类的构造方法创建一个子类
8、的对象时,子类的构造方法总是先调用父类的某个构造方法,也就是说,如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有:super();5.3.1 核心知识核心知识 _2class Student int number;Student()Student(int number)this.number=number;class UniverStudent exten
9、ds Student boolean isMerried;UniverStudent(int number,boolean b)super(number);/调用父类的构造方法Student(int number)isMerried=b;5.3.2 能力目标能力目标 在子类中使用super关键字调用被隐藏(覆盖)的方法。5.3.3 任务驱动将下列将下列 BeijingWaterUser.java中的中的【代码代码】替换为程序代码。替换为程序代码。WaterUser.java 和和 程序运行效果如图。程序运行效果如图。任务任务 小结小结(1)当super调用被隐藏的方法时,该方法中出现的成员变量
10、就是被子类隐藏的成员变量或继承的成员变量。(2)如果类里定义了一个或多个构造方法,那么Java不提供默认的构造方法(不带参数的构造方法),因此,当在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误。5.3.4 实践环节 5.4 5.4 final关键字 5.4.1 核心知识核心知识 final关键字可以修饰类、成员变量和方法中的局部变量。1final类 可以使用final将类声明为final类。final类不能被继承,即不能有子类。final class A 2final方法 如果用final修饰父类中的一个方法,那么这个方法不允许子类重写。3常量 如
11、果成员变量或局部变量被修饰为final的,就是常量。5.4.2 能力目标能力目标 掌握final关键字的用法。5.4.3 任务驱动将中的【代码】替换为程序代码。程序运行效果如图。程序运行效果如图。任务任务 小结小结 final参数可以接受所传递值,但在方法内不容许对final参数进行写操作,即参数得到值之后,就按常量对待final参数 5.4.4 实践环节 5.5 5.5 对象的上转型对象 5.5.1 核心知识核心知识 1上转型对象上转型对象 假设People类是American类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,比如:2上转型对象的特性1)上转型对象不能操作
12、子类新增的成员变量;不能调用子类新增的方法。2)上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。People person;person=new American();或People person;American anAmerican=new American();person=anAmerican;这时,称对象person是对象anAmerican的上转型对象。5 5.5.2 能力目标能力目标 掌握怎样使用上转型对象调用子类重写的实例方法 5.5.3 任务驱动将下列中的【代码】替换为程序代码。程序运行效果如图。程序运行效果如图。ChinaPeopl
13、e.java AmericanPeople.java 任务任务 小结小结(1)在Aplication类的main方法中,不能让上转型对象people调用speakChinese()或void speakEnglish(),因为这两个方法不是子类继承或重写的方法,而是子类新增的方法。(2)如果子类重写了父类的静态方法(static修饰的方法),那么子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。5.5.4 实践环节 上机调试下列代码,特别注意程序的输出结果。上机调试下列代码,特别注意程序的输出结果。5.6 5.6 多态和抽象类 5.6.1 核心知识核心知识1多态性多态性
14、多多态态性性就就是是指指父父类类的的某某个个方方法法被被其其子子类类重重写写时时,可可以以各各自自产产生生自自己己的的功功能能行行为为,也也就就是是说说一一个个类类的的不不同同子子类类在在重重写写方方法法时时可可以以各各自自产产生生适适合合其其子子类类对对象象的行为。的行为。2用上转型对象体现多态用上转型对象体现多态 上上转转型型对对象象在在调调用用子子类类重重写写的的方方法法时时就就可可能能具具有有多多种种形形态态,因因为为不不同同的的子子类在重写父类的方法时可能产生不同的行为。类在重写父类的方法时可能产生不同的行为。3抽象类及抽象方法抽象类及抽象方法 用关键字用关键字abstract修饰的
15、类称为修饰的类称为abstract类(抽象类)。如:类(抽象类)。如:abstract class A 用关键字用关键字abstract修饰的方法称为修饰的方法称为abstract方法(抽象方法)方法(抽象方法).1)1)和普通类相比和普通类相比,abstractabstract类中可以有类中可以有abstractabstract方法方法,也可以有非也可以有非abstractabstract方法。方法。2)2)对对于于abstractabstract类类,不不能能使使用用newnew运运算算符符创创建建该该类类的的对对象象。如如果果一一个个非非抽抽象象类类是某个抽象类的子类,那么它必须重写父类
16、的抽象方法,给出方法体。是某个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体。3)3)可可以以使使用用abstractabstract类类声声明明对对象象,尽尽管管不不能能使使用用newnew运运算算符符创创建建该该对对象象,但但该该对对象可以成为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法象可以成为其子类对象的上转型对象,那么该对象就可以调用子类重写的方法 5.6.2 能力目标能力目标 掌握用抽象类的对象做上转型对象,并体现子类的多态掌握用抽象类的对象做上转型对象,并体现子类的多态。5.6.3 任务驱动将下列中的【代码】替换为程序代码。程序运行效果如图程序运行效果如图5
17、.85.8。任务任务 小结小结 当用上转型对象调用子类重写的方法时,具有很好通用性,因为程序不必关心子类的具体对象的名字,就可以让上转型对象调用子类体重写的方法。不允许使用static修饰abstract方法,即abstract方法必须是实例方法。不允许使用final修饰abstract类,即要允许abstract类有子类 5.6.4 实践环节 上上机机调调试试下下列列代代码码,注注意意对对象象car是是哪哪些些对对象象的的上上转转性性对对象象,并怎样体现多态的并怎样体现多态的。5.7 5.7 接口与实现接口与实现 5.7.1 核心知识核心知识_11接口的定义接口的定义 使使用用关关键键字字i
18、nterface来来定定义义一一个个接接口口。接接口口的的定定义义和和类类的的定定义义很很相相似似,分分为为接口的声明和接口体,例如:接口的声明和接口体,例如:interface Printable public final static int MAX=100;public abstract void add();public abstract float sum(float x,float y);接口使用关键字接口使用关键字interface来声明自己是一个接口来声明自己是一个接口,格式格式:interface 接口的名字接口的名字 接口体中包含常量的声明和抽象方法两部分。接口体中包含常量
19、的声明和抽象方法两部分。接口体中所有的常量的访问权限一定都是接口体中所有的常量的访问权限一定都是public,而且是而且是static常量。常量。所有的抽象方法的访问权限一定都是所有的抽象方法的访问权限一定都是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)
20、;5.7.1 核心知识核心知识 _22实现接口实现接口 接接口口由由类类来来实实现现,即即由由类类来来重重写写接接口口中中的的方方法法。一一个个类类可可以以在在类类声声明明中中使使用用关关键键字字implements声声明明实实现现一一个个或或多多个个接接口口。如如果果类类实实现现多多个个接接口口,用用逗逗号号隔隔开开接接口口名名,如如A类类实实现现Printable和和Addable接口:接口:class A implements Printable,Addable 如如果果一一个个非非抽抽象象类类实实现现了了某某个个接接口口,那那么么这这个个类类必必须须重重写写这这个个接口中的所有方法。接
21、口中的所有方法。需需要要注注意意的的是是,由由于于接接口口中中的的方方法法一一定定是是public abstract方方法法,所所以以类类在在重重写写接接口口方方法法时时不不仅仅要要去去掉掉abstract修修饰饰符符、给给出出方方法法体体,而且方法的访问权限一定要明显地用而且方法的访问权限一定要明显地用public来修饰。来修饰。5.7.2 能力目标能力目标 握类怎样实现接口。5.7.3 任务驱动将下列 中的【代码】替换为程序代码 程序运行效果如图程序运行效果如图 任务任务 小结小结接口的思想在于它可以要求某些类有相同名称的方法,但方法的具体内容可以不同,即要求这些类实现接口,以保证这些类一
22、定有接口中所声明的方法(即所谓的方法绑定)。接口在要求一些类有相同名称的方法的同时,并不强迫这些类具有相同的父类。5.7.4 实践环节 5.8 5.8 接口回调接口回调 5.8.1 核心知识核心知识 1接口变量接口变量 接接口口也也是是Java中中一一种种重重要要数数据据类类型型,用用接接口口声声明明的的变变量量称称为为接口变量。接口变量。接接口口变变量量中中可可以以存存放放实实现现该该接接口口的的类类的的实实例例的的引引用用,即即存存放放对象的引用。对象的引用。接接口口回回调调就就是是指指:可可以以把把实实现现某某一一接接口口的的类类创创建建的的对对象象的的引引用用赋赋给给该该接接口口声声明
23、明的的接接口口变变量量中中,那那么么该该接接口口变变量量就就可可以以调调用用被被类类实实现现的的接接口口方方法法。实实际际上上,当当接接口口变变量量调调用用被被类类实实现现的的接接口口方方法时,就是通知相应的对象调用这个方法。法时,就是通知相应的对象调用这个方法。2接口与多态接口与多态 把把实实现现接接口口的的类类的的实实例例的的引引用用赋赋值值给给接接口口变变量量后后,该该接接口口变变量就可以回调类重写的接口方法。量就可以回调类重写的接口方法。由由接接口口产产生生的的多多态态就就是是指指不不同同的的类类在在实实现现同同一一个个接接口口时时可可能能具具有有不不同同的的实实现现方方式式,那那么么
24、接接口口变变量量在在回回调调接接口口方方法法时时就就可可能能具具有多种形态。有多种形态。5.8.2 能力目标能力目标 使用接口变量调用类实现的接口方法,即掌握接口回调技术。5.8.3 任务驱动将下列中的【代码】替换为程序代码。SoundMachine.javaSoundMachine.java 程序运行效果如图程序运行效果如图5.115.11。任务任务 小结小结(1)使用接口可以让程序更加容易维护和扩展,比如,在任务模版中,再增加实现Sound接口的类时,不需要修改SoundMachine类的代码。(2)在设计程序时应当根据具体的情况来确定是使用抽象类还是接口。5.8.4 实践环节 上机调试下
25、列程序,注意接口回调是怎样体现多态的。上机调试下列程序,注意接口回调是怎样体现多态的。5.9 5.9 匿名类匿名类 5.9.1 核心知识核心知识_1 1内部类内部类 可可以以在在一一个个类类中中再再定定义义另另一一个个类类,这这样样的的类类称称作作当当前前类类中中的的内内部部类类,而而包包含含内内部部类类的的类类称称为为内内部部类类的的外外嵌嵌类类。内内部部类类的的外外嵌嵌类类的的成成员员变变量量在在内内部部类类中中仍仍然然有有效效,内内部部类类中中的的方方法法也也可可以以调调用用外外 嵌嵌 类类 中中 的的 方方 法法。RedCowForm.java 内内部部类类的的类类体体中中不不可可以以
26、声声明明类类变变量量和和类类方方法法。内内部部类类仅仅供供它它的的外外嵌嵌类类使使用用,其其他他类类不不可可以以用用某某个个类类的的内内部部类声明对象。类声明对象。class RedCowForm RedCow cow;/内部类声明对象cow RedCowForm()cow=new RedCow(150,112);public void showCowMess()cow.speak();class RedCow /内部类的声明 String cowName=红牛;int height,weight,price;RedCow(int h,int w)height=h;weight=w;void
27、speak()System.out.println(高:+height+cm 重:+weight);/内部类结束 5.9.1 核心知识核心知识 _22匿名类与子类匿名类与子类 Java允允许许直直接接使使用用一一个个类类的的子子类类的的类类体体创创建建一一个个子子类类对对象象。例例如如,假假设设Bank是一个类,那么下列代码就是用是一个类,那么下列代码就是用Bank的一个子类创建对象:的一个子类创建对象:new Bank()匿名类的类体 ;使使用用匿匿名名类类时时,必必然然是是在在某某个个类类中中直直接接用用匿匿名名类类创创建建对对象象,因因此此匿匿名名类类一一定是内部类。定是内部类。如如果果
28、某某个个方方法法的的参参数数是是Bank类类型型,那那么么经经常常使使用用匿匿名名类类创创建建一一个个对对象象,并并将对象的引用传递给方法的参数。例如,对于将对象的引用传递给方法的参数。例如,对于 void showMoney(Bank bank)其其中中的的参参数数bank是是Bank类类型型,那那么么在在调调用用showMoney时时,可可以以向向showMoney方方法的参数法的参数bank传递一个匿名类(传递一个匿名类(Bank的一个子类)的对象,例如:的一个子类)的对象,例如:void showMoney(new Bank()Bank类的子类的类体 )/注意这里最后的右小括号注意:方
29、法中的参数是匿名类创建的一个对象注意:方法中的参数是匿名类创建的一个对象.5.9.2 能力目标能力目标 掌握怎样向方法的参数传递一个匿名类的对象的引用。5.9.3 任务驱动将下列中的【代码】替换为程序代码.OutputAlphabet.java ShowBoard.java 程序运行效果如图。程序运行效果如图。任务任务 小结小结 由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的不带参数的构造方法。5.9.4 实践环节 上机调试下列程序,注意匿名类的用法。上机调试下列程序,注意匿名类的用法。5.10 5.10 小结小结 1.子类继承的方法只能操作子类继承和隐藏的成员变量。2.子类重写或新增的方法能操作子类继承和新声明的成员变量,但不能直接操作隐藏的成员的变量。3.上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。4.接口的接口体中只可以有常量和abstract方法。5.接口变量中只能存放实现该接口的类的实例(对象)的引用。6.当接口变量中存放了实现接口的类的对象的引用后,接口变量就可以调用类实现的接口方法,这一过程被称为接口回调。“本节结束咯本节结束咯偶都会了偶都会了太葱明了太葱明了”
限制150内