`
dickyzhu
  • 浏览: 111718 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

关于继承和重载的问题

阅读更多
public class Super {

}

public class Sub extends Super {

}

public class A {
     
      public void fun(Super s){
            System.out.println("A");
      }

}

public class B extends A {
      public void fun(Sub s){ // 这是对A.fun(Super s)的重载(Overload),而不是重定义(Override)
            System.out.println("B");
      }
}

public class C extends B {

      public void fun(Sub s){ // 这是对B.fun(Sub s)的重定义
            System.out.println("C");
      }
      public static void main(String[] args) {
            Sub sub = new Sub();
            Super s = sub;
           
            B b = new B();
            A a = b;
            a.fun(s);// 这里调用的是A.fun(Super s),因为这个函数并没有被B重定义
            a.fun(sub);// 这里调用的仍然是A.fun(Super s),原因同上。另外,a的申明类型是A实际类型是B,那么我们应该按被调用对象a的申明类型还是实际类型查找函数申明(Signature,也叫函数头)?当然是申明函数!而函数体却应该按照实际类型寻找!切记。背后的原因是:查找函数头是编译阶段的事情,而对象的实际类型只能到运行阶段才能确定,所以编译器不得不根据对象的申明类型来找函数头;到了运行阶段,JVM能够确定对象的实际类型了,于是就能按照实际类型找到函数体(动态定连就是这么实现的)。所以a.fun(sub)的申明是A.fun(Super s),确定这一点以后再看这个函数有没有被a的实际类型重定义。如果有就调用重定义函数的函数体;如果没有,就调用申明函数的函数体。
            b.fun(s);// B从A中继承了一个fun(Super),自己又重载了一个fun(Sub),s的申明类型是Super。在查找函数申明(后函数头)时,参数也看其申明类型(原因同上,编译阶段无法确定参数的实际类型)。所以调用的是A.fun(Super s)
            b.fun(sub);// 根据对象和参数的申明类型找到函数头B.fun(Sub s),b的实际类型也是B,所以调用的也是这个函数的函数体。
           
            C c = new C();
            a = c;
            b = c;
            a.fun(s);// 根据对象和参数的申明类型找到函数头A.fun(Super s),该函数没有被重定义,所以调用的肯定也是这个函数的函数体。
            a.fun(sub);// 根据对象和参数的申明类型找到最匹配的函数头是A.fun(Super s),该函数没有被重定义,所以调用的肯定也是这个函数的函数体。
           
            b.fun(s);// 根据对象和参数的申明类型找到函数头A.fun(Super s),该函数没有被重定义,所以调用的肯定也是这个函数的函数体。
            b.fun(sub);// 根据对象和参数的申明类型找到函数头B.fun(Sub s),b的实际类型是C,C重定义了这个函数,所以调用的是C.fun(Sub s)的函数体。
           
            c.fun(s);// 根据对象和参数的申明类型找到函数头A.fun(Super s),该函数没有被重定义,所以调用的肯定也是这个函数的函数体。
            c.fun(sub);// 根据对象和参数的申明类型找到函数头C.fun(Sub s),c的实际类型也是C,所以调用的也是这个函数的函数体。
      }
}
分享到:
评论

相关推荐

    类继承方法重载

    通过实践这个小程序,你可以更好地理解如何在实际项目中应用类继承和方法重载,以及它们如何帮助解决特定问题。这将有助于提升你的编程技巧,特别是在设计复杂系统时,能够更加熟练地利用面向对象的设计原则和技巧。...

    C++运算符重载和继承

    在C++编程中,运算符重载和继承是两个核心概念,它们极大地扩展了语言的能力,使得代码更加灵活且易于理解。本章我们将深入探讨这两个主题,并通过实际代码示例来阐述它们的工作原理。 首先,让我们关注“运算符...

    继承与派生 运算符重载

    继承与派生运算符重载 继承是面向对象编程(Object-Oriented Programming)中的一种机制,它允许一个类继承另一个类的成员变量和成员函数。继承的主要目的是实现代码的重用和提高编程效率。在C++中,继承是通过...

    继承与多态,重载和重写

    总结起来,继承、多态、重载和重写是面向对象编程中的核心概念,它们相互关联,共同构建出灵活、可扩展的代码结构。通过继承,我们可以构建类的层次结构,多态则提供了代码的通用性和灵活性。而重载和重写则是实现...

    关于PHP属性重载问题

    关于PHP的属性重载的问题,进行测试研究,证明private不继承下来。

    继承与方法的重载学习代码

    在Java编程语言中,继承和方法的重载是两个核心概念,它们对于构建可扩展、模块化的代码至关重要。本文将详细解析这两个概念及其在实际编程中的应用。 首先,让我们了解继承(Inheritance)。继承是面向对象编程的...

    [Java]重载,重写以及继承,多态的区

    在Java编程语言中,重载、重写、继承与多态是四个非常核心的概念,它们在面向对象编程中扮演着至关重要的角色。接下来,我们将详细探讨这些概念,并通过实例加以说明。 ### 重载(Overload) 重载是指在同一个类中...

    C++随堂测试(继承、多态、重载)(答案).docx

    通过本资源,读者可以了解到C++中继承的特点和种类、多态的实现方式、重载的规则和限制等。 1. 继承:C++中的继承关系具有自反性、传递性和反对称性。继承可以分为公有继承、私有继承和保护继承三种,分别对应基类...

    Java的继承、重载和多态.doc

    Java是一种面向对象的编程语言,其三大特性是封装、继承和多态。封装是指将数据和操作这些数据的方法捆绑在一起,形成一个独立的实体——类。继承是子类继承父类的属性和方法,使得代码复用变得可能。多态则是指同一...

    java 重载,重写以及继承,多态的区别

    Java 中的重载、重写、继承和多态是四个不同的概念,它们之间存在一定的关系,但也存在明显的区别。 重载(Overload) 重载是指在同一个类中可以定义多个同名的方法,但这些方法的形参个数或类型必须不同。编译器...

    java学习笔记 继承 重载 覆盖

    Java编程语言的学习涉及众多核心概念,本篇笔记主要探讨了几个关键知识点:继承、重载和覆盖。首先,我们从Java环境配置开始,确保能够正确地运行Java程序。在Windows系统中,需要设置环境变量PATH,指向JDK安装目录...

    Java方法继承、方法重载、方法覆盖总结

    ### Java方法继承、方法重载、方法覆盖总结 ...综上所述,方法继承、方法重载和方法覆盖是Java面向对象编程中的三个重要概念。正确理解和运用这些概念能够帮助开发者编写出更加灵活、高效和可维护的代码。

    继承多态重载与接口PPT学习教案.pptx

    总结,这个PPT学习教案涵盖了Java中关于继承、多态、覆盖、重载、构造函数重载、内部类与匿名类以及接口的基本概念和使用,这些都是Java面向对象编程的基础,对于理解Java编程模式和设计模式至关重要。通过学习这些...

    C++课件 类和对象 数入输出 运算符重载 继承派生 指针数组等等课件

    这个课件主要涵盖了C++的几个核心概念和技术,包括类和对象、数值输入输出、运算符重载、继承与派生以及指针和数组。下面将详细阐述这些知识点。 1. **类和对象**:在C++中,类是数据和操作数据的方法的集合,是...

    C++面向对象技术完全剖析_源代码(继承,封装,多态,虚函数,纯虚函数,虚拟继承,多重继承,函数重载,指针……)

    1。多继承 基类 派生类(还要有多个父类) 第二条:涉及构造和析构 通过实例化一个对象体现构造和析构 还要有函数重载 第三个:基类 派生类的关系 以及如何访问抽象... 还要有函数重载 指针 指针悬挂 无参函数等问题....

    C++随堂测试(继承、多态、重载).docx

    本资源摘要信息涵盖了C++编程语言中的重要概念,包括继承、多态和重载。通过本资源,可以了解C++中的继承关系、保护继承、运算符重载、虚函数、多态性等概念,并且可以了解如何在实际编程中应用这些概念。 一、继承...

    JAVA语言中构造方法的继承与重载探讨.pdf

    JAVA语言中构造方法的继承与重载探讨

    java 重载,继承,重写和多态的区别. doc

    Java编程语言中的重载、继承、重写和多态是面向对象编程的四个核心概念,它们各自具有独特的功能和用途。 1. **重载(Overloading)**: 重载发生在同一个类内部,指的是可以有多个同名方法,但这些方法的参数列表...

    实验三_类的重载继承和多态.doc

    总结来说,这个实验通过实际编程练习,让我们深入理解了类的重载、继承和多态的概念,以及它们在实际问题中的应用。通过设计和实现学校教务管理系统的用户模型,我们能够更好地掌握这些面向对象的核心概念,并为将来...

    c++程序设计讲义 C++的初步认识 类和对象 运算符重载 继承与派生 多态性与虚函数 输入输出流

    4. 继承与派生:继承是面向对象的一个关键特性,它允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为。通过继承,子类可以扩展或修改父类的功能,实现代码的复用和类层次结构的建立。 5. 多态性与...

Global site tag (gtag.js) - Google Analytics