public class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } } public class B extends A{ public String show(B obj){ return ("B and B"); } public String show(A obj){ return ("B and A"); } } public class C extends B{ } public class D extends B{ } public class Test { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); System.out.println("2--" + a1.show(c)); System.out.println("3--" + a1.show(d)); System.out.println("4--" + a2.show(b)); System.out.println("5--" + a2.show(c)); System.out.println("6--" + a2.show(d)); System.out.println("7--" + b.show(b)); System.out.println("8--" + b.show(c)); System.out.println("9--" + b.show(d)); } }
1
--A and A
2
--A and A
3
--A and D
4
--B and A
5
--B and A
6
--A and D
7
--B and B
8
--B and B
9
--A and D
在这里看结果1、2、3还好理解,从4开始就开始糊涂了,对于4来说为什么输出不是“B and B”呢?
首先我们先看一句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这句话对多态进行了一个概括。其实在继承链中对象方法的调用存在一个优先级:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
首先我们分析5,a2.show(c),a2是A类型的引用变量,所以this就代表了A,a2.show(c),它在A类中找发现没有找到,于是到A的超类中找(super),由于A没有超类(Object除外),所以跳到第三级,也就是this.show((super)O),C的超类有B、A,所以(super)O为B、A,this同样是A,这里在A中找到了show(A obj),同时由于a2是B类的一个引用且B类重写了show(A obj),因此最终会调用子类B类的show(A obj)方法,结果也就是B and A。
按照同样的方法我也可以确认其他的答案。
方法已经找到了但是我们这里还是存在一点疑问,我们还是来看这句话:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。这我们用一个例子来说明这句话所代表的含义:a2.show(b);
这里a2是引用变量,为A类型,它引用的是B对象,因此按照上面那句话的意思是说有B来决定调用谁的方法,所以a2.show(b)应该要调用B中的show(B obj),产生的结果应该是“B and B”,但是为什么会与前面的运行结果产生差异呢?这里我们忽略了后面那句话“但是这儿被调用的方法必须是在超类中定义过的”,那么show(B obj)在A类中存在吗?根本就不存在!所以这句话在这里不适用?那么难道是这句话错误了?非也!其实这句话还隐含这这句话:它仍然要按照继承链中调用方法的优先级来确认。所以它才会在A类中找到show(A obj),同时由于B重写了该方法所以才会调用B类中的方法,否则就会调用A类中的方法。
所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
相关推荐
### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...
在这个实例中,我们将探讨如何通过接口(Interface)和抽象类(Abstract Class)实现多态,并结合两种不同的排序算法——快速排序(QuickSorting)和冒泡排序(BubbleSorting)来展示其实用性。 首先,`ComputeData...
Java编程语言以其面向对象特性,包括接口、继承、多态性等核心概念,为开发者提供了强大的设计和实现能力。在本实例中,我们将探讨这些关键概念,并通过具体代码示例来展示它们的实际应用。 首先,**接口...
4. instanceof关键字:用于判断对象是否是某个类或其子类的实例,是多态中常用的一个条件判断。 总的来说,Java的多态性是实现面向对象设计的重要工具,它使代码更加灵活、可扩展,同时也提高了代码的复用性。理解...
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
用代码实例和注释向你讲述什么是多态,实例更容易理解
多态在Java中有着深远的影响,它提高了代码的可重用性、灵活性和可扩展性。本篇将通过一个经典例子深入解析多态的含义,并通过实际代码展示其应用。 首先,我们要理解多态的定义。在Java中,多态性(Polymorphism)...
### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...
而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于对象的实例化类型而非声明类型。 1. **方法重载(Overloading)**:在同一类中,可以有多个同名的方法,只要它们的参数列表不同(参数个数、...
在这个“java多态实验”中,我们可以看到一系列小代码实例,这些实例旨在帮助理解和应用多态特性。下面我们将深入探讨多态的概念、实现方式以及它在实际开发中的应用。 1. 多态性定义: 多态(Polymorphism)源自...
Java多态是面向对象编程中的一个核心概念,它在程序设计中扮演着至关重要的角色。多态性(Polymorphism)一词源自希腊语,意为“多种形态”,在Java中,它允许我们使用一个接口来代表多个不同类的对象,从而实现更...
在使用多态时,需要注意以下几点: - 接口中定义的方法必须在实现类中提供精确匹配的实现,包括方法的返回类型、名称和参数列表。 - 当通过接口引用调用方法时,该方法必须在接口中已经声明,并且在实现类中的实现...
Java 继承 多态方面的实例源码,内容方面涉及对象类Object和它的toString()方法、多态性、动态绑定和一般程序设计、数组线性表ArrayList类、final类、方法和变量、数据域和静态方法的隐藏等。。。
在给定的“java多态作业”中,可以看到多态性的应用主要体现在实现多个接口(MouseMotionListener、MouseListener和ActionListener),这些接口代表了不同的事件监听器,每个接口都定义了一系列方法来处理特定类型的...
Java 多态实例代码详解 Java 多态实例代码是一种编程技术,它允许开发者使用同一个接口来表示不同的行为或形态。在 Java 中,多态性是通过继承和重写来实现的。下面是 Java 多态实例代码的详细解释: 一、多态性...
Java多态理解 java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = ...
多态性分为编译时多态和运行时多态,其中运行时多态是Java中最常见的形式,也称为动态绑定。在深入探讨Java中多态的内存分析之前,我们需要先理解一些基本概念。 首先,了解Java内存模型至关重要。Java程序运行时...
### Java多态详解 #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个...
在这个“Java多态案例及源码.rar”压缩包中,你将找到一系列关于Java多态的实例和源代码,非常适合教师在教学时作为示例,以及学生在自我学习和巩固知识时参考。 1. **多态性定义**:多态(Polymorphism)在希腊语...