全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入理解java多态性(一)相关类classA.publicStringshow(Dobj).return(AandD);publicStringshow(Aobj).return(AandA);classBextendsA.publicStringshow(Bobj).return(BandB);publicStringshow(Aobj).return(BandA);classCextendsB.classDextendsB.(二)问题:以下输出结果是什么? Aa1=newA();Aa2=newB();Bb= newB();Cc=newC();Dd=newD();System.out.println(a1.show(b); System.out.println(a1.show(c); System.out.println(a1.show(d); System.out.println(a2.show(b); System.out.println(a2.show(c); System.out.println(a2.show(d); System.out.println(b.show(b); System.out.println(b.show(c);System.out.println(b.show(d); (三)答案 Aand A A and A A and D B and A B and A A and D B and B B and B A and D(四)分析 比较好理解,一般不会出错。就有点糊涂了,为什么输出的不是B and B”呢?!先来回顾一下多态性。 运行时多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。) 好了,先温习到这里,言归正传!实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show(super)O)、super.show(super)O)。让我们来看看它是怎么工作的。 比如,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show(super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为B and A”。 再比如,b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show(super)O),this为b,O为C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),输出为B and B”。 按照上面的方法,可以正确得到其他的结果。 问题还要继续,现在我们再来看上面的分析过程是怎么体现出蓝色字体那句话的内涵的。它说:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。还是拿a2.show(b)来说吧。 a2是一个引用变量,类型为A,它引用的是B的一个对象,因此这句话的意思是由B来决定调用的是哪个方法。因此应该调用B的show(B obj)从而输出B and B”才对。但是为什么跟前面的分析得到的结果不相符呢?!问题在于我们不要忽略了蓝色字体的后半部分,那里特别指明:这个被调用的方法必须是在超类中定义过的,也就是被子类覆盖的方法。B里面的show(B obj)在超类A中有定义吗?没有!那就更谈不上被覆盖了。实际上这句话隐藏了一条信息:它仍然是按照方法调用的优先级来确定的。它在类A中找到了show(A obj),如果子类B没有覆盖show(A obj)方法,那么它就调用A的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026山东省考申论A类模拟试卷(文化传承与创新主题)
- 销售人员晋升述职报告范文(2篇)
- 《国潮新生》教学设计-2026-2027学年沪书画版(五四学制)(新版)初中美术七年级上册
- 社区肿瘤随访管理工作指南(2025版)
- 宠物遛护服务操作指南
- 司炉工考试题库及答案
- 2026年工业废水处理工技能竞赛理论参考试题库(含答案)
- 2026年气象观测试题及答案
- 离子注入机运维工程师安全操作规程
- 初中物理教资面试光学真题演练及解析
- 2026年迪庆州德钦县国投(集团)公司及下属二级公司工作人员招聘(25人)笔试备考题库及答案详解
- 2026年人教版新教材数学五年级上册全套单元、期中、期末测试题及答案(共10套题)
- 综合实践 制订节水方案(教学设计)数学北师大版六年级上册2026秋
- 部编版道法新教材四年级年级上册第2课-选举班委会-第2课时
- 2026年麻醉药品精神药品管理课件
- 牧草种植收购合作协议模板二篇
- 2026年(完整版)计算机控制技术试卷及答案
- 梁启超中学以上作文教学法
- JJG 693-2011可燃气体检测报警器
- 疼痛科护士镇痛模式的个体化选择与应用
- 人卫慕课《走进肺功能》试题答案
评论
0/150
提交评论