`
小杨学JAVA
  • 浏览: 901803 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入理解java多态性<转载>

 
阅读更多

                   深入理解java多态性

        昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整理出来供大家参考,不一定完全正确,欢迎大家批评指正。

(一)相关类

class A ...{
         
public String show(D obj)...{
                
return ("A and D");
         }
 
         
public String show(A obj)...{
                
return ("A and A");
         }
 
}
 
class B extends A...{
         
public String show(B obj)...{
                
return ("B and B");
         }

         
public String show(A obj)...{
                
return ("B and A");
         }
 
}

class C extends B...{} 
class D extends B...{} 

(二)问题:以下输出结果是什么?

        A a1 = new A();
        A a2 
= new B();
        B b = 
new B();
        C c 
= new C(); 
        D d 
= new D(); 
        
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));     ⑨    

(三)答案

              ①   A and 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的方法是可以改变返回值的类型。

        当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)

        好了,先温习到这里,言归正传!实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为: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的show(A obj)(由于B继承A,虽然没有覆盖这个方法,但从超类A那里继承了这个方法,从某种意义上说,还是由B确定调用的方法,只是方法是在A中实现而已);现在子类B覆盖了show(A obj),因此它最终锁定到B的show(A obj)。这就是那句话的意义所在。

分享到:
评论

相关推荐

    AIC的Java课程1-6章

    第5 版 清华大学出版社&lt;br&gt; “SCJP学习指南” 人民邮电出版社&lt;br&gt; “Java 编程思想” 第3版 机械工业出版社&lt;br&gt; 教学内容和要求&lt;br&gt;知识点 重要程度 使用频度 难度&lt;br&gt;Java 入门 高 中 易&lt;br&gt;变量和运算符 高 ...

    清华大学C++程序设计讲稿及源程序

    继承与派生&lt;br&gt;第8章 多态性&lt;br&gt;第9章 群体类和群体数据的组织&lt;br&gt;第10章 泛型程序设计与C++标准模板库&lt;br&gt;第11章 流类库与输入/输出&lt;br&gt;第12章 异常处理&lt;br&gt;第13章 MFC库与WINDOWS程序开发概述 &lt;br&gt;

    深入理解Java多态

    深入理解 Java 多态性 在 Java 编程语言中,多态性是指一个对象可以有多种形式的能力,具体来说就是一个对象可以有多个不同的类形态。多态性是面向对象程序设计代码重用的一个最强大机制,Java 多态性的概念也可以...

    JAVA / JSP 版网站内容管理系统

    国内 JAVA版网站管理系统 的领航者,依托于 JAVA 技术,专注于&lt;br&gt;网站内容管理;&lt;br&gt;&lt;br&gt; CMS4J绝非国外一些开源产品的改造版,我们秉承用户本土化的原&lt;br&gt;则,切身体验国内CMS系统的应用现状与实际需求,为中小企业...

    VC++ 上位机组态程序(带温控器,电子秤,AD卡)

    VC++ 上位机组态程序(接口:带温控器,电子秤,AD卡) &lt;br&gt;主要功能:&lt;br&gt;1. 初始参数有效性检查。&lt;br&gt;2. 电脑实时显示去毛刺曲线图。&lt;br&gt;3. 产生客户计算公式定制报表(含曲线等图)。&lt;br&gt;4. 保存、查询打印历史报表...

    C++经典课件(PPT幻灯)汇集.rar(整理)V20080505A

    函数.ppt&lt;br&gt;│ 第八章 引用.ppt&lt;br&gt;│ 第六章 数组.ppt&lt;br&gt;│ 第十一章构造函数和析构函数.ppt&lt;br&gt;│ 第十七章文件.ppt&lt;br&gt;│ 第十三章运算符重载.ppt&lt;br&gt;│ 第十二章静态友元.ppt&lt;br&gt;│ 第十五章多态性.ppt&lt;br&gt;│...

    VASP ----

    VASP是使用赝势和平面波基组,进行第一定律分子动力学计算的软件包。VASP中的方法基于有限温度下的...&lt;br&gt;费米水平的部分态密度;&lt;br&gt;电荷密度旋转密度;&lt;br&gt;轨道和轨道密度。&lt;br&gt; &lt;br&gt; &lt;br&gt;操作平台:Linux/Unix &lt;br&gt;

    java类和对象继承多态性

    java类和对象继承多态性 java类和对象继承多态性是java语言中的一种基本机制,它允许开发者创建一个新的类,并继承已有的类的属性和行为。这种机制可以提高代码的复用性和维护性。 继承是java语言中的一种机制,...

    java多态性练习

    总结一下,这个“java多态性练习”将带你深入理解Java中的多态性和抽象类。通过实际的代码示例和分析,你将学会如何在自己的项目中有效地应用这些概念,以实现更高效、更灵活的代码设计。这个练习对于任何希望提升...

    java多态性

    "Java多态性详解" Java多态性是面向对象编程的基本特征之一,它允许子类继承父类,并对父类的方法进行重写或重载,以实现更多的灵活性和可扩展性。在Java中,多态性的体现主要有两种形式:方法的重载和方法的重写。...

    Java SQL 数据库 html笔试题

    7. **结构化标签**:如`&lt;header&gt;`, `&lt;nav&gt;`, `&lt;article&gt;`, `&lt;aside&gt;`, `&lt;footer&gt;`等,用于提升网页可读性和语义性。 了解并熟练掌握这些概念和用法,将有助于你在Java、SQL和HTML的笔试中取得好成绩。同时,对于...

    实验二:java多态性.rar

    Java多态性是面向对象编程中的一个重要概念,它在Java中起到了关键的作用,使得程序更加灵活,可扩展性更强。...通过本实验,你将能深入理解多态性如何工作,以及如何在实际项目中有效利用这一特性。

    Java多态性实验报告

    ### Java多态性实验知识点解析 #### 实验背景与目的 本次实验主要目的是让学生通过实践操作,深入理解Java中的多态性概念,并掌握如何利用多态性实现代码的灵活性和可扩展性。实验中,学生将通过编写一个处理复数...

    串口监控抓包工具-SerialSpy

    &lt;br&gt;使用方法:&lt;br&gt; 1: 解包&lt;br&gt; 2:运行SerSpyInst.exe安装监控设备&lt;br&gt; 3:运行SerialSpy.exe即可.&lt;br&gt;&lt;br&gt;同类的程序有PortMon,SerialMonitor, 但是PortMon会导致设备在拔除后端口就不能用了;SerialMonitor会过期,...

    java5泛型新特性 pdf

    Java 5 泛型是Java编程语言中一个重要的里程碑,它引入了类型安全的集合,大大增强了代码的可读性和可维护性。泛型在Java 5中首次亮相,为开发者提供了一...对于Java开发者来说,深入理解和熟练掌握泛型是至关重要的。

    课本的练习

    这些练习涵盖了多个关键领域,包括数组、高级数据结构、图形用户界面(GUI)、线程、XML处理、文件和流操作、时间处理、接口与多态性、迭代机制以及排序和查找算法。以下是对这些知识点的详细阐述: 1. **数组**:...

    JAVA学习教程(HTML版) .rar_JAVA HTML教程_java html学习_java学习_java学习教程_jav

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而闻名。...本教程“JAVA学习教程(HTML版)”结合了这两者,旨在帮助...对于想要深入理解和应用Java的开发者来说,这是一份不可多得的学习资料。

    Java多态性探悉()

    本文将深入探讨Java多态性的概念、实现机制以及相关的编程规则。 一、基本概念 多态性意味着一个接口可以有多种不同的表现形式。在Java中,可以通过子类对象引用赋值给超类对象引用变量来实现这一特性。这意味着,...

    真正的单重态标量对Veltman条件的影响

    &lt;mi&gt;σ &lt;/ mi&gt; &lt;mo Stretchy =“&gt; / &lt;/ mo&gt; &lt;msub&gt; &lt;mrow&gt; &lt;mi&gt;σ&lt;/ mi&gt; &lt;/ mrow&gt; &lt;mrow&gt; &lt;mtext&gt; SM &lt;/ mtext&gt; &lt;/ mrow&gt; &lt;/ msub&gt; &lt;/ math&gt;。 用紫外线截止尺度Λ计算的希格斯平方的单环辐射校正带有负系数...

    多态性的理解

    ### 多态性的理解 #### 一、多态性概述 多态性是面向对象编程中的一个重要特性,它使得一个接口或方法能够适用于多种类型的数据。在Java中,多态性主要通过方法重载(overloading)、方法重写(overriding)以及...

Global site tag (gtag.js) - Google Analytics