版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA核心技术OOP4OOP4多态多态多态(多态(1 1)继承是指从一个基类(父类)派生出派生类(子类)的过程;继承使用关键字extends;对于类成员,可以使用public、protected、缺省和private这4种访问权限修饰符;对于类,可以使用public和缺省这2个访问权限;创建子类实例时,必须先执行父类的构造方法,然后再执行子类的构造方法;super关键字有两种主要用途,都与父类有关。本章相关词汇本章相关词汇单单 词词说说 明明Override method方法重写方法重写Convert转换转换abstract抽像的抽像的本章目标本章目标面向对象-多态抽像方法方法覆盖引用转型了
2、解多态,在Java中实现多态5父父/ /子类中的同名成员子类中的同名成员上次课在讲述super关键字时,提到了父类和子类中存在同名成员的情况;如果是同名属性(即成员变量同名),那么可以通过this和super显式地区分开来;如果是同名方法(即成员方法同名),情况将会相对复杂。6父父/ /子类中成员方法仅仅同名子类中成员方法仅仅同名class BaseClass /定义基类 public void fun() /具体实现代码略 class DerivedClass extends BaseClass /派生类继承于基类 public void fun(int x) /跟父类中有相同名称的方法 /
3、具体实现代码略 /*如果仅仅只是名称相同,但参数列表不同的话,则构成方法重载*/7父父/ /子类中成员方法同原型子类中成员方法同原型class SuperClass /定义父类 public void fun() /具体实现代码略 class SubClass extends SuperClass /子类继承于父类 public void fun() /与父类中的方法完全同原型 /具体实现代码略 /*如果不但名称相同,而且连方法原型也完全相同的话,则构成方法覆盖*/8方法覆盖方法覆盖在类的继承体系结构中,如果子类中出现了与父类中有同原型的方法,那么认为子类中的方法覆盖了父类中的方法(也称为方法
4、重写);通过子类的实例调用被覆盖的方法时,将总是调用子类中的方法,而父类中的方法将被隐藏。9方法覆盖示例方法覆盖示例class ParentClass /定义父类 public void fun() System.out.println(这是父类中的方法。); class ChildClass extends ParentClass /子类继承于父类 public void fun() /子类覆盖父类中的方法 System.out.println(这是子类中的方法。); class OverriddenTest /用于容纳main方法 public static void main(Strin
5、g args) ParentClass parObj = new ParentClass(); parObj.fun(); /父类的实例调用此方法 ChildClass chiObj = new ChildClass(); chiObj.fun(); /子类的实例调用此方法 10方法覆盖的注意事项方法覆盖的注意事项子类中重写的方法,其访问权限不能比父类中被重写方法的访问权限更低11区分方法覆盖和方法重载区分方法覆盖和方法重载方法覆盖(重写)和方法重载是两个极易混淆的概念,必须严格区分;方法覆盖出现的前提条件之一是必须有继承发生的情况下,而且要求父类和子类中的方法必须同原型;方法重载时,继承并不
6、是必需的,它只要求方法名称相同,而参数列表则必须不同,换言之,各方法的原型其实是不同的。12引用转型引用转型基类的引用可以指向派生类的对象,如:BaseClass obj = new DerivedClass();这样的语句是合法的;但是派生类的引用则不可以指向基类的对象,如:DerivedClass obj = new BaseClass();这样的语句将引发错误。13引用转型示例引用转型示例class Person /定义人类 class Student extends Person /学生类继承于人类 public class OverriddenDemo public static v
7、oid main(String args) /正确,所有的学生一定是人 Person per = new Student(); /错误,并不是所有的人都是学生 Student std = new Person(); 14问题问题既然基类的引用可以指向派生类的实例,如果基类和派生类中存在方法覆盖的情况,那么通过基类的引用将会调用到哪个类中的方法呢?15class Shapes /基本形状类 public void draw() /绘图的方法 System.out.println(绘制了一个基本形状。); class Circle extends Shapes /圆形类继承于基本形状类 publi
8、c void draw() /覆盖父类的绘图方法 System.out.println(绘制了一个圆形。); class Square extends Shapes /正方形类继承与基本形状类 public void draw() /覆盖父类的绘图方法 System.out.println(绘制了一个正方形。); public class polymorphismDemo public static void main(String args) Shapes obj = new Shapes(); /父类的引用指向父类的实例 obj.draw(); /调用绘图方法 obj = new Circ
9、le(); /父类的引用指向子类的实例 obj.draw(); /调用绘图方法 obj = new Square(); /父类的引用指向子类的实例 obj.draw(); /调用绘图方法 示例示例16多态多态从上例中可以看出,父类的引用指向哪个类的实例就调用哪个类中的方法;同样是使用父类的引用,调用同一个名称的方法,却可以得到不同的调用结果,这就是Java中的多态,即:同一函数,多种形态;实际上多态包括动态多态和静态多态。17静态多态静态多态静态多态也称为编译时多态,即在编译时决定调用哪个方法;静态多态一般是指方法重载;只要构成了方法重载,就可以认为形成了静态多态的条件;静态多态与是否发生继承
10、没有必然联系。18动态多态动态多态动态多态也称为运行时多态,即在运行时才能确定调用哪个方法;形成动态多态必须具体以下条件:必须要有继承的情况存在;在继承中必须要有方法覆盖;必须由基类的引用指向派生类的实例,并且通过基类的引用调用被覆盖的方法;由上述条件可以看出,继承是实现动态多态的首要前提。多态案例创建教员基类,在教员基类的基础上,再创建两个子类:JAVA教员和.NET教员,开发一个类代表教学管理中心,负责对各教员进行评估,评估内容包括: 1、教员的自我介绍 2、教员的授课多态案例public class TMQ public void judge(JavaTeacher t)t.sayHi(
11、);t.lesson();public void judge(DotNetTeacher t)t.sayHi();t.lesson();public static void main(String args) TMQ tmq = new TMQ();tmq.judge(new JavaTeacher(李明李明,25,3);tmq.judge(new DotNetTeacher(张明张明,27,5); 第一种解决方案大家好!我是大家好!我是JAVA老师李明老师李明.启动启动 Eclipse知识点讲解知识点讲解总结提问总结提问大家好!我是大家好!我是.NET老师张明老师张明.启动启动 Visual
12、 Studio 2008知识点讲解知识点讲解总结提问总结提问控制台输出控制台输出多态案例回顾 现在,升级教员类,增加一种新类型:DBTeacher,该类型的教员专门负责教授数据库,要求如下: 属性:姓名、年龄、教学年限 方法:授课(启动Sql Server、实施理论课授课)、自我介绍 同时,教学管理中心也负责对这类教员进行评估多态案例回顾如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立DBTeacher类修改教学管理中心类,增加方法:judge(DBTeacher t)每增加一种新的教员类型,都要修改教学管理中心类,增加相应每增加一种新的教员类型,都要修改教学管理中心类,增加相应
13、的的judge(评估评估)方法,代码的可扩展性及可维护性极差方法,代码的可扩展性及可维护性极差 能找到这个解决方案的弊端吗?能找到这个解决方案的弊端吗?多态案例回顾 第二种解决方案使用多态public class TMQ public void judge(Teacher t)t.sayHi();t.lesson();public static void main(String args) TMQ tmq = new TMQ();tmq.judge(new JavaTeacher(李明李明,25,3);tmq.judge(new DotNetTeacher(张明张明,27,5);tmq.jud
14、ge(new DBTeacher(“李岚李岚,26,3);可以接收子类类型可以接收子类类型根据实际创建的对象根据实际创建的对象类型调用相应方法类型调用相应方法大家好!我是大家好!我是JAVA老师的李明老师的李明.启动启动 Eclipse知识点讲解知识点讲解总结提问总结提问大家好!我是大家好!我是.NET老师张明老师张明.启动启动 Visual Studio 2005知识点讲解知识点讲解总结提问总结提问大家好!我是数据库老师李岚大家好!我是数据库老师李岚.启动启动 Sql Server知识点讲解知识点讲解总结提问总结提问控制台输出控制台输出使用多态之后,当需要增加新的子类类型时,无需更改总部类,
15、程序的可扩展性及可维护性增强 public class Teacher public void lesson() System.out.println(知识点讲解知识点讲解); System.out.println(总结提问总结提问); public class Test public static void main(String args) TMQ hq = new TMQ(); hq.judge(new DBTeacher(); 3多态案例回顾1、子类重写父类的方法2、编写方法时,使用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法public class DBTea
16、cher extends Teacher public void lesson() System.out.println(启动启动 SqlServer); super.lesson(); 1public class TMQ public void judge(Teacher t) t.lesson(); 225总结总结如果基类和派生类中有原型完全相同的方法,那么就形成了方法覆盖;引用转型是指父类的引用可以指向子类的实例,但反之不可以;在有方法覆盖的前提下,并且有引用转型的情况,就将形成动态多态。小结 2 请编码实现如下需求: 乐器(Instrument)分为:钢琴(Piano)、小提琴(Vio
17、lin) 各种乐器的弹奏( play )方法各不相同。 编写一个测试类InstrumentTest,要求: 编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。 在main方法中进行测试抽象方法抽象方法在某些情况下,基类无法(或者没有必要)提供被覆盖方法的具体实现,那么就可以将此方法声明成抽象方法;使用关键字abstract声明抽象方法,一般语法:访问权限 abstract 返回值类型 方法名称(参数列表);如:public abstract void draw();抽象类抽象类如果某个类中包含有抽象方法,那么该类就必须定义成抽象类;定义抽象类同样使用关键字ab
18、stract,一般语法:访问权限 abstract class 类名 成员列表如:public abstract class Shapes public abstract void draw();抽象类的注意事项抽象类的注意事项抽象类不可以直接实例化,只可以用来继承;抽象类的派生子类应该提供对其所有抽象方法的具体实现;可以这么认为,抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型;如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化;抽象类中也可以包含有非抽象的方法;构造方法和静态方法不可以修饰为abstract。总结 2-2给
19、定如下Java代码,编译运行后,输出结果是什么?public class Teacher public void giveLesson()System.out.println(知识点讲解知识点讲解);public class DBTeacher extends Teacher public void giveLesson()System.out.println(启动启动 SqlServer);12public class Test public static void main(String args) Teacher t = new DBTeacher ();t.giveLesson();
20、控制台输出控制台输出 启动启动 SqlServer 作业 在java中开发一个飞行体系,该体系可以对任何飞行器进行控制起飞和降落! 基类:飞行类Plane ,包含起飞和降落的方法 子类:直升飞机Copter ,重写父类两个方法 子类:喷气式飞机Jet ,重写父类两个方法 测试类:用多态实现调用32飞行系统代码提示飞行系统代码提示/具体实现代码省略public class Plane void fly(); / 起飞 void land(); / 着陆 public class Copter extends Plane void fly(); / 直升机起飞 void land().; /直升机着陆 public class Jet extends Plane void fly(); / 喷气式飞机起飞 void land().; /喷气式飞机着陆 /现在我们设计控制一个飞行的方法public void planeFly(P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学(历史学)中国近现代史期末测试题及答案
- 2025年高职(游戏设计)游戏关卡设计试题及答案
- 制药企业安全培训内容课件
- 工程安全资料培训课件
- 公安自查自纠报告及整改措施详述
- 2026CNAO全国中学生天文知识竞赛预赛试题(附答案)
- 广东省东莞市虎门镇2024-2025学年三年级上册期末考试数学试卷(含答案)
- 铁路防雨线路维护协议
- 2026年WMS仓储管理咨询协议
- 2026年普法依法治理工作计划4篇
- 农村经济统计培训
- 滴滴出行网约车加盟合作协议
- 广东工业大学《嵌入式系统软件设计A》2023-2024学年第二学期期末试卷
- 会议推广费合同范本
- 提高路缘石安装施工一次合格率
- 湖北省孝感市汉川市2023-2024学年八年级上学期期末考试数学试卷(含解析)
- 工程质量保证书范本保证书
- 2024年东北大学马克思主义基本原理概论(期末考试题+答案)1
- 小市政施工方案样本
- 剧场工作总结
- GB/T 42765-2023保安服务管理体系要求及使用指南
评论
0/150
提交评论