`
zhishan332
  • 浏览: 14327 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入理解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)。这就是那句话的意义所在。
分享到:
评论

相关推荐

    实验二:java多态性.rar

    Java多态性是面向对象编程中的一个重要概念,它在Java中起到了关键的作用,使得程序更加灵活,可扩展性更强。本实验将深入探讨Java多态性的核心原理与应用。 首先,我们要理解多态性的基本含义。多态性...

    深入理解Java多态

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

    java多态性练习

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

    Java多态性实验报告

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

    Java多态性探悉()

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

    Java基础知识:多态性

    Java 基础知识:多态性 Java 语言是一种面向对象的编程语言,多态性是其核心特性之一。多态性是指同一个方法在不同对象上具有不同的行为。...希望读者通过本文的学习,能够深入理解和灵活应用 Java 中的多态性特性。

    java多态性详解——父类引用子类对象

    本文将深入探讨Java中的多态性,特别是“父类引用子类对象”的概念,以及这一特性如何在实际编码中体现。 ### 多态性概述 多态性主要通过方法的重写(Overriding)、重载(Overloading)和动态绑定(Dynamic Binding)来...

    JAVA核心知识点整理.pdf

    Java是一种广泛使用的面向对象编程语言,其核心特性之一就是多态性。多态性赋予了Java代码灵活性和可扩展性,使得程序可以处理多种不同类型的对象而无需知道具体类型。在Java中,多态性主要分为静态多态性和动态多态...

    Java基础案例教程.rar

    3. **类与对象**:理解面向对象编程的核心概念,如类的定义、对象的创建、封装、继承和多态性。你将通过实例学习如何编写和使用类,以及如何通过对象操作数据。 4. **异常处理**:学习Java的异常处理机制,包括try-...

    Java语言的类和多态性的公理语义.pdf

    总之,Java语言的类和多态性的公理语义研究,不仅是对Java语言深入理解的基础,也是推动计算机语言研究向前发展的重要推动力。通过这种研究,我们可以更精确地把握Java语言的语义特性,提高编程的效率和代码的可靠性...

    最终JAVA面试题目汇总 Java面试题集锦 Java面试题大全 java面试100题目.pdf

    6. 继承与多态:掌握单一继承、接口、抽象类、多态性在代码设计中的应用。 二、Java集合框架 1. 集合接口:List、Set、Queue、Map接口的理解及其常用实现类如ArrayList、LinkedList、HashSet、HashMap等。 2. ...

    比特Java研发工程师JavaSE.zip

    理解类与对象的关系,如何创建和使用它们,以及如何通过接口实现多态性,是JavaSE的核心内容。 3. **异常处理**:Java中的异常处理机制有助于编写健壮的代码。通过try-catch-finally块,开发者可以捕获并处理运行时...

    【深入Java虚拟机(5)】多态性实现机制-静态分派与动

    在Java编程语言中,多态性是面向对象编程的核心特性之一,它允许我们使用一个接口来代表多个不同的类。多态性的实现主要依赖于两种机制:静态分派和动态分派。本文将深入探讨这两种机制及其在Java虚拟机(JVM)中的...

    Java语言程序设计.进阶篇.原书第10版

    读者将学会如何设计和实现复杂的类结构,以及如何利用接口和抽象类来实现多态性。 2. **异常处理**:Java中的异常处理是程序健壮性的重要组成部分。书里会介绍如何使用try-catch-finally语句块,理解不同类型的异常...

    java知识要点总结.rar

    6. **java多态、抽象类、接口总结.pdf**:多态性是面向对象的另一个重要特征,允许使用父类引用操作子类对象。抽象类提供了一种部分实现的模板,而接口则定义了行为规范。理解它们之间的区别和联系,有助于设计灵活...

    Java初级案例源码.rar

    1. **对象和类**:Java是面向对象的语言,所以案例可能包含创建和使用类的示例,如封装、继承和多态性等面向对象特性。 2. **数据结构**:基础案例可能包括数组的使用,可能还会有链表、栈和队列等更高级的数据结构...

    java入门基础教程.zip

    14. **接口与抽象类**:学习接口与抽象类的区别,以及如何使用它们来实现多态性。 15. **注解**:注解是一种元数据,可以为编译器和工具提供额外的信息,用于代码分析、代码生成或部署验证。 通过阅读“Java基础...

    Java基础知识笔记.rar

    6. **类与对象**:理解面向对象编程的基本概念,包括类的定义、对象的创建、封装、继承和多态性。 7. **构造器**:了解构造函数的作用,用于对象初始化,并理解默认构造器和自定义构造器的使用。 8. **访问修饰符*...

    java中级班代码.

    在中级阶段,你需要理解如何设计和实现类与对象,以及如何通过接口实现多态性。 2. **异常处理**:Java的异常处理机制是其强大的特性之一,通过try-catch-finally语句块来捕获和处理程序运行时可能出现的错误,保证...

Global site tag (gtag.js) - Google Analytics