`
莫唐莫
  • 浏览: 2541 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于继承多态的理解

阅读更多


public class Extendc {
 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{}
   class E{}
    public static void main(String[] args){
     Extendc et=new Extendc();
        Extendc.A a1= et.new A();
        A a2 = et.new B();  
        B b = et.new B();  
        C c = et.new C();   
        D d = et.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));        
    }
}

如上所示例程1,输出结果如下:
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

理解各个输出,关键理解点在继承与多态,我们知道,对一个引用变量而言,编译时,变量与其所声明的类型绑定,而运行环境中,其和实际引用类型绑定,所以上述例程中,引用变量a2编译时是和A绑定,但在运行时引用的是B的对象,依据如此理解,或许有人觉得a2.show(b)理当输出“B and B”才对,但实际输出的却是“B and A”,也就是说a2.show(b)实际上调用的是class B的show (A obj)方法,为什么不调用class B的show (B obj)方法呢,细揣摩之,如此理解,未知确否。

所谓编译时和声明类型绑定,编译器在编译a2.show(B)时,认为该方法调用的是A的show(A)方法,因为A类里只有两个方法,参数b是B的实例,B继承自A,所以理应在类A的两个方法里决定调用show(A);那么实际运行的时候,java虚拟机运行环境究竟决定怎么调用这个方法呢,这就用到了重载和重写的概念,a2实际上是B的一个实例,B从A继承了show(A)的方法,虚拟机判断B对方法show(A)进行了重写,所以就调用被重写了的show(A)方法,于是输出“B and A”。

我们对上面的程序稍作修改,进一步验证一下我们的推论。

如下例程2,更换了一行代码
public class Extendc {
 class A {  
        public String show(D obj){  
               return ("A and D");  
        }   
        public String show(Object obj){  
               return ("O 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{}
    public static void main(String[] args){
     Extendc et=new Extendc();
        Extendc.A a1= et.new A();
        A a2 = et.new B();  
        B b = et.new B();  
        C c = et.new C();   
        D d = et.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));        
    }
}

输出:
O and A
O and A
A and D
O and A
O and A
A and D
B and B
B and B
A and D
依据上述原理,验证通过。

这里又发现一个值得注意的问题,编译器在根据参数决定调用那个方法的时候,编译器总是将和参数声明类型最相近的那一个方法作为调用方法。比如例程2的最后一个,b.show(d),在B的方法中(包含继承自父类的),四个方法均参数符合调用要求,编译器选择的是A类中的show(D d)。我们不妨称之为“就近原则”。




欢迎指正学习。

0
0
分享到:
评论

相关推荐

    易语言的继承多态演示

    压缩包中的"易语言的继承多态演示源码"文件可能包含了一个实际的程序示例,展示了如何在易语言中应用继承和多态。源码通常包括类定义、继承关系的声明、方法的重写以及可能的接口实现。通过分析源码,我们可以看到...

    java 三大特性--封装、继承和多态理解

    Java编程语言以其强大的功能和广泛的应用而闻名,其中三大特性——封装、继承和多态是其核心概念,对于理解和编写高效、可维护的代码至关重要。 **封装**是面向对象编程的基础,它涉及到将数据(属性)和操作这些...

    关于C#继承多态的应用项目

    在C#编程语言中,继承和多态是面向对象编程的两大核心概念,它们极大地增强了代码的可重用性、灵活性和扩展性。本项目旨在通过实际操作来深入理解和应用这两个概念。 首先,让我们理解“继承”。继承允许一个类...

    c++ 的封装继承多态例子

    在C++编程语言中,封装、继承和多态是面向对象编程(OOP)的三大核心概念。下面将深入解析这三个关键概念,并结合"cppgood"这个可能包含示例代码的压缩包,来阐述它们在实际编程中的应用。 **封装** 是面向对象编程...

    关于继承多态集合和IO的一个例子

    通过这样的练习,学习者能够更好地理解如何在实际场景中应用继承、多态、集合和IO操作,加深对这些概念的理解,提高编程能力。对于初学者来说,这是一个很好的实践项目,可以帮助他们将理论知识转化为实际技能。

    javascript中如何实现封装,继承和多态

    javascript中如何实现封装,继承和多态

    教学视频-继承&多态

    在编程领域,继承和多态是面向...通过观看"2-2继承&多态"的教学视频,你可以深入理解这两个概念,并通过提供的源码进行实践操作,巩固理论知识,如有疑问还可以在线提问,这无疑将加速你的编程技能提升,避免走弯路。

    C++继承与多态例子

    在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和...通过深入理解继承和多态,开发者可以更好地设计和实现面向对象的解决方案。

    C#关于继承与多态的简单练习源码

    根据文件名推测,这是一个关于矩形类的练习,可能包含了如何利用继承和多态的概念来设计一个图形类库。通常,我们可能会有一个抽象的`Shape`类作为基类,它包含共享的属性(如颜色)和方法(如获取面积),然后有...

    关于继承和多态的简单练习

    通过查看和分析这些代码,你可以深入理解继承和多态的概念,并从中学习如何在实际项目中有效地运用它们。 总的来说,继承和多态是面向对象编程的关键要素,它们使得代码更加灵活、可扩展且易于维护。通过不断的实践...

    java 接口 类 继承 多态的简单实例

    Java编程语言以其面向对象特性,...实践这些概念不仅能够加深理解,还有助于编写出更加灵活、可维护的代码。对于初学者来说,这是一个很好的起点,而对于经验丰富的开发者来说,也是一个复习和巩固基础知识的好机会。

    动物练习.NET面向对象继承多态

    以下是关于面向对象编程、抽象方法、继承和多态的详细解释。 1. 面向对象编程(OOP): OOP是一种编程思想,它将程序设计为由相互协作的对象集合构成。每个对象都有自己的属性(数据)和行为(方法)。这种结构使...

    C++程序设计-封装、继承多态应用示例

    总结来说,"C++程序设计-封装、继承多态应用示例"是一个很好的教学资源,它通过一个生动的龙与人战斗场景,帮助初学者理解并实践了面向对象编程的关键概念。通过这个示例,学习者不仅可以了解这些理论知识,还能通过...

    继承与多态 课后习题答案

    继承与多态 继承是面向对象编程中的一种机制,它允许一个类继承另一个类的所有成员变量和成员函数,从而可以实现代码的复用和减少代码的冗余。在 C++ 中,继承是通过关键字 `class` 和 `:` 实现的,例如 `class ...

    关于c++ 继承多态的深度思考

    ### 关于C++继承与多态的深度思考 #### 继承(Inheritance) 在C++中,继承是一种机制,允许创建一个新类(派生类)来继承另一个已存在的类(基类)的所有属性和行为。继承使得代码复用成为可能,同时也提供了面向...

    继承与多态程序演示

    理解并熟练运用继承和多态是提升软件开发效率的关键。它们使得代码结构更加清晰,模块化程度更高,同时降低了维护成本。通过学习这个“继承与多态程序演示”,你可以深入理解这两种机制,并能够在实际项目中有效地...

    C#做的计算器,利用类的封装继承多态。。

    在C#编程中,"C#做的计算器,利用类的封装继承多态"是一个典型的面向对象编程示例。这个计算器项目展示了如何应用C#的核心概念,如类、封装、继承和多态,来构建一个实际的软件应用。下面将详细解释这些知识点。 1....

    leijicheng.rar_继承多态问题

    本主题将深入探讨“leijicheng.rar”压缩包中涉及的“继承多态问题”,特别是虚拟基类和虚拟函数在多继承中的应用。 首先,我们来理解“继承”。继承是一种机制,允许一个类(子类)继承另一个类(父类)的属性和...

    浅谈c++的精髓之继承和多态

    ### 面向对象编程与C++中的继承和多态 #### 1. 面向对象编程思想的诞生 面向对象编程(Object-Oriented Programming, OOP)的引入,是为了克服传统面向过程编程的一些局限性。面向过程编程,如C语言,更侧重于按...

    Java实验报告——类的继承、多态的应用

    在本实验报告中,我们将深入探讨Java编程中的两个核心概念:类的继承和多态的应用。实验主要目标是加深对抽象类和抽象方法的理解,并掌握如何在实际编码中实现类的继承以及多态性。 首先,让我们理解抽象类和抽象...

Global site tag (gtag.js) - Google Analytics