`
莫唐莫
  • 浏览: 2392 次
  • 性别: 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
分享到:
评论

相关推荐

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

    Java课程的一道实验考试题。主要是关于IO(从键盘输入),继承,多态(动态绑定,静态绑定),集合(客户化排序)等内容。感觉对于理解多态和继承还是挺有作用的。

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

    NULL 博文链接:https://lingf.iteye.com/blog/1450831

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

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

    C++继承与多态例子

    C++实现的一个继承与多态的例子,内容详细且易懂

    继承与多态讲义

    学习继承与多态可用。对于继承与多态有着较清晰的理解

    java继承多态

    理解继承如何增强软件的可重用性 超类(父类)和子类

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    Java 继承与多态的深入理解

    主要介绍了Java 继承与多态的深入理解的相关资料,子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为,需要的朋友可以参考下

    实验四类的继承与多态实验.doc

    实验四 类的继承与多态实验1.理解软件重用性的一种形式——继承。 2.能够通过继承已有的类创建新类。 3.理解基类和派生类的概念。 4.能够在派生类中使用构造函数和析构函数 5.学习虚基类在解决二义性问题中的...

    用一个示例来说明C#中的继承、封装和多态

    用一个示例来说明C#中的继承、封装和多态,希望对于刚学C#语言的朋友们理解继承、封装和多态有一定的帮助作用吧

    《java面向对象程序设计-继承和多态》教案.doc

    圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰...

    继承与多态.docx

    实验目的及要求 ...3) 理解什么是多态 4) 掌握继承的设计技巧 实验内容 对某动物园的动物进行面向对象建模,需要利用面向对象中的继承和多态来设计类。 动物园包括的动物、动物类型以及他们的继承关系

    继承-多态-访问控制

    本ppt详细介绍有关继承、多态,访问控制方面的知识要点,对大家学习理解这块儿很有帮助。

    继承与多态

    1、理解 Java 类的继承和多态的概念 2、掌握类的继承机制的实现 3、掌握方法的重载,以及多态的实现。

    C++中的封装、继承、多态理解

    继承(inheritance):C++通过类派生机制来支持继承。被继承的类型称为基类或超类,新产生的类为派生类或子类。保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。...

    Java封装、继承、多态三大特征的理解

    封装、继承、多态三大特征是java中比较常用的,务必要掌握,下面给大家介绍Java封装、继承、多态三大特征的理解,有不清楚的朋友可以一起学习下

    Java面向对象编程(封装/继承/多态)实例解析

    主要介绍了Java面向对象编程(封装/继承/多态)实例解析的相关内容,具有一定参考价值,需要的朋友可以了解下。

    ( 继承和多态和接口

    可以用于继承,多态的学习,有些概念不理解可以参考。

    继承与多态的实例代码

    本资源完全免费,可以配合小菜鸡写的文章一起配合使用,想把一些不好理解的通俗易懂的解释出来,也希望在大学几年能锻炼自己,让自己的文章和代码被更多人使用,更多人喜欢,自己的理解也可以让大家一起讨论,一起...

    C#多态和继承(测试与理解).docx

    关于c#的多态与继承的理解和代码实现,新手使用理解过程

Global site tag (gtag.js) - Google Analytics