版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第三章面向对象编程3,软件工程学院 主讲人:张昊,2,3.8 多态,什么是多态 JAVA里没有多继承,一个类只能有一个父类。 一个父类可以有多个子类,而在子类里可以重写父类的方法,每个子类里重写的代码不一样。这样用父类的变量去引用子类的实例,在调用相同的方法时得到的结果不一样,这就是多态,也就是调用相同的方法会有不同的结果。,3,Java语言允许用父类的变量去引用子类的实例。 Animal xiaohuang=new Dog(); /父类变量animal引用一个Animal子类Dog的实例 我们称Animal是xiaohuang的声明(形式)类型 Dog是xiaohuang的实际类型。 A
2、nimal xiaohua=new Cat(); /父类变量xiaohua引用另一个Animal子类Cat的实例,用父类的变量去引用子类的实例,4,例1:,public class Father/父类 public void hitChild() /父类有一个打孩子方法 public class Son1 extends Father /子类1 /重写父类打孩子方法 public void hitChild() System.out.println(为什么打我?我做错什么了!); public class Son2 extends Father /子类2 /重写父类打孩子方法 public v
3、oid hitChild() System.out.println(我知道错了,别打了!);public class Son3 extends Father /子类3 /重写父类打孩子方法 public void hitChild() System.out.println(我跑,你打不着!);,5,例1:,/测试类public class Test public static void main(String args) Father father; father = new Son1(); father.hitChild(); father = new Son2(); father.hitC
4、hild(); father = new Son3(); father.hitChild();都调用了相同的方法,出现了不同的结果!这就是多态的表现!,6,【3.12】,Class SuperClass void method1() System.out.println(“method1 in Super Class”); void method2() System.out.println(“method2 in Super Class”); class SubClass extends SuperClass void method1() System.out.println(“method1
5、 in Sub Class”); void method3() System.out.println(“method3 in Sub Class”); ,7,class Main public static void main(String args) SuperClass a=new SubClass(); /声明类型为SuperClass,实际类型是SubClass a.method1(); /method1 in SubClass, SubClass对SuperClass中的method1进行了重写 a.method2(); /method2 in SuperClass, SubClas
6、s中没有method2,只能调用SuperClass的method2 /a.method3();错误 ,8,如果我们调用a的method3()方法,则无法通过编译。 这是因为java语言为强制类型的语言,编译时会检查形式类型是否提供该方法。a的形式类型是SuperClass,不提供method3()方法,虽然a的实际类型有method3()方法,但编译时只检查形式类型,不检查实际类型。 所以形式类型也称为编译期类型,实际类型也称为执行期类型。,注意:,9,注意:,通常我们不会去写“SuperClass a=new SubClass();” 但实际应用中,形式类型和实际类型不同的情况却往往在不知
7、不觉中发生。 看下例:,10,【例3.13】,class Other static void method4(SuperClass a) /a 的形式类型是SuperClass,实际类型则不一定是SuperClass a.method1(); public class Main public static void main(String args) SubClass b=new SubClass(); Other.method4(b); /相当于SuperClass a=new SubClass(); /*调用类方法method4(),需要一个SuperClass类型的参数,而传入的参数b的
8、实际类型是SubClass,这就造成了形式类型和实际类型的不一致*/ ,11,在java语言中,多态性体现在两个方面: 由方法重载实现的静态多态性(编译时多态) 在编译阶段,要调用哪个被重载的方法,编译器会根据参数的不同调用相应的方法。重载是一个类中多态性的一种表现。 方法重写实现的动态多态性(运行时多态) 在JAVA中可以用父类的变量去引用子类的实例,这样在调用相同的方法时会得到不同的结果。重写是父类与子类之间多态性的一种表现,,注意:,12,重写时必须遵循两个原则:,重写时必须遵循两个原则: 重写后的方法不能比被重写的方法有更严格的访问权限; 重写后的方法不能比被重写的方法有更多的异常。,
9、13,从上面的例子可以加以归纳p46,多态的(方法重写实现的动态多态)发生必须是: (1)有直接或间接继承关系的两个类,子类重写父类的方法。 (2)实际类型为子类的对象,被当成父类来使用,调用重写方法。,注意:,14,java运行时系统根据调用该方法的实例,来决定调用哪个方法。 对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法; 如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。,重写方法的调用原则,15,3.8.2多态带来的优越性,多态是建立在继承的基础上的,没有继承,就不会有多态。继承的目的:一是为了继承程序代码,达到程序代码的复用;二是为了继承接口,达
10、到接口的复用。,16,3.8.3 多态的机制只能用在实例方法上,多态机制只能用在实例方法上: 不能用在成员变量上。 对于成员变量,形式类型决定一切,完全和实际类型无关 不能用在类方法上,17,【例3.14】多态的机制不能用在成员变量上,class SuperClass int field1=a; int field2=b; class SubClass extends SuperClass int field1=c; int field3=d; public class Main public static void main(String args) SuperClass a=new Sub
11、Class(); System.out.println(a.field1); /a,而不是c System.out.println(a.field2); /b /System.out.println(a.field3);错误 ,18,【例3.15】多态的机制不能用在类方法上,class SuperClass static void method1() System.out.println(“method1 in Super Class”); static void method2() System.out.println(“method2 in Super Class”); class Sub
12、Class extends SuperClass static void method1() System.out.println(“method1 in Sub Class”); static void method3 System.out.println(“method3 in Sub Class”); ,19,public class Main public static void main(String args) SuperClass a=new SubClass(); a.method1();/结果为method1 in Super Class a.method2();/结果为me
13、thod2 in Super Class /a.method3();错误 ,【例3.15】,20,3.9 final 和 abstract关键字,3.9.1 final final可以修饰类、变量和方法。 final 修饰变量 用final关键字修饰的标识符被称为常量。 例 final int a=5;/a为常量 注意:修饰成员变量时,定义的同时必须给出初始值,而修饰局部变量时不做要求。,21,final修饰的标识符被称为常量,class aa int b=0; final int a=5; /a是常量,定义的同时必须给出初始值 void f() b=4; a=4; /出错! ,22,用fin
14、al关键字修饰的类不能被继承 final class A /A为最终类,不可以被继承。 class B extends A /出错!,用final关键字修饰类,23,用final关键字修饰的方法不能被重写 例如 :final int f() class A final void f() class B extends A void f() /出错,用final关键字修饰的方法不能被重写 注意:如果一个类为 final 类,那么它的所有方法都为隐式的 final 方法。,用final关键字修饰方法,24,3.9.2 abstract,abstract可修饰符类和方法 用abstract 关键字修
15、饰的类叫做抽象类 用abstract 关键字修饰的方法叫做抽象方法 格式如下: abstract class abstractClass /抽象类 abstract returnType abstractMethod(paramlist) /抽象方法,25,抽象方法,抽象方法:用abstract修饰,只有方法的声明,没有方法体 如: abstract void f(); 注意: 抽象方法必须在子类中给出具体实现 若类中包含了抽象方法,则该类必须被定义为抽象类 抽象方法不能是私有的(private) 不能是静态的(static),26,抽象类:用abstract修饰的类。如: abstract
16、class 类名 /定义抽象类 type var1; /声明数据成员; void f(int a,int b) /声明方法; abstract 返回数据类型 方法名(参数); /声明抽象方法; ,抽象类,27,不能使用抽象类来创建对象(抽象类不能实例化) 如果一个类中有抽象方法,这个类一定是抽象类 如果一个类被声明为抽象类,类体中也可以没有抽象方法 如果一个类继承了抽象类,在这个类中必须实现它所继承的抽象类的所有抽象方法(抽象方法必须被重写) 一抽象父类A 定义了两个抽象方法f1,f2;B、C、D类都继承于A,那么B、C、D都要实现方法f1和f2。,抽象类,28,抽象类是一种比普通类更高层次的
17、抽象,类似于类的框架 抽象类的作用是为了被继承。 通过抽象类创建的子类具有一定的共性,如都要实现父类中的抽象方法,抽象类的作用,29,例3.16,abstract class A /定义抽象类A int i; abstract void abstractFunc();/声明抽象方法 void notabstractFunc()/一般方法 i=0; System.out.println(“from A:”+i); class B extends A /B继承了抽象类A void abstractFunc()/必须实现A类中的抽象方法 i=1; System.out.println(“from B
18、:”+i); ,30,class C extends B / C继承了类B void abstractFunc()/重写了父类B中的方法,而不是A类中抽象方法的实现 i=3; System.out.println(“from C:”+i); class D extends C public static void main(String args) B b=new B(); b.abstractFunc();/fromB:1 b.notabstractFunc();/from A:0 C c=new C(); c.abstractFunc(); /from C:3 ,例3.16,31,abstract class Employee int basic = 2000; abstract void salary();/抽象方法 class Manager extends Employ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理科研人才与国科金项目培养
- 旅游行业客户服务专员面试技巧
- 旅游景点服务中心负责人培训资料
- 旅游行业党建探索:旅行社党务工作者面试全解
- 激光雷达技术安全性能评估报告
- 医护护理护理动画
- 报关客服职业规划
- 统编版道德与法治四年级下册第1课我们的好朋友 第一课时教学设计
- 青蛙变王子职业规划书
- 中职生就业指导讲座参考模版
- - 育才中学2026学年春季第二学期初二年级地理实践活动与知识应用教学工作计划
- 2025年邳州恒润城市投资笔试及答案
- 电信诈骗安全教育培训课件
- 2026年安徽粮食工程职业学院单招(计算机)测试模拟题库附答案
- 肥胖课件之针灸治疗
- “十五五规划纲要”解读:双碳引领绿色发展
- 《应急预案编制与演练》全套教学课件
- 护理共情疲劳开题报告
- 《化工原理》实验指导书
- 铁路隧道敞开式TBM始发及试掘进施工实施细则
- 高考化学湖北长江作业本 化学人教选择性必修2 04 课后素养评价(四)
评论
0/150
提交评论