zoukankan      html  css  js  c++  java
  • 关于java中多态的理解

    java三大特性:封装,继承,多态。

    多态是java的非常重要的一个特性;

    那么问题来了:什么是多态呢?

      定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。

      技术:实现多态的技术称为动态绑定,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法

      作用:消除类型之间的耦合性。

      例子:在不同的环境下执行相同的操作但是会产生不一样的效果。

      多态存在的三个必然条件:继承,重写,超类引用指向子类对象。

      多态的好处:

        1.可替换性(substitutability)。多态对已存在代码具有可替换性。
        2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
        3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
        4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
        5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

      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));   ①  //"A and A"
            System.out.println(a1.show(c));   ②  //"A and A"
            System.out.println(a1.show(d));   ③  //"A and D"
            System.out.println(a2.show(b));   ④  //"B and A"
            System.out.println(a2.show(c));   ⑤  //"B and A"
            System.out.println(a2.show(d));   ⑥  //"A and D" 
            System.out.println(b.show(b));    ⑦  //"B and B"
            System.out.println(b.show(c));    ⑧  //"B and B"
            System.out.println(b.show(d));    ⑨  //"A and D"
    

      解析:①,②,③调用a1.show()方法,a1 属于A类,A类有两个方法show(D obj)和show(A obj)。①a1.show(b),参数b为A类的子类对象,这里为向上转型,相当于A       obj=b;所以调用show(A obj)方法,得到A and A结果。②同理,③参数为d,调用show(D obj),得到A and D。
           ④,⑤,⑥调用a2.show()方法,A a2 = new B();是向上转型,所以对a2方法的调用,使用A1类的方法show(D obj)和show(A obj),但此时show(A obj)已经被重         写为return ("B and A"), ④a2.show(b),调用show(A obj),得到B and A。⑤同理,⑥调用show(D obj),得到A and D。
                  ⑦,⑧,⑨调用b.show()方法,b为B类,B类的show方法有继承的show(D obj),自己的两个show(B obj)、show(A obj)。
           ⑦调用show(B obj),得到B and B,⑧向上转型,调用show(B obj),得到B and B⑨show(D obj),得到A and D

      小白写来给自己看的,有问题请帮忙指出,谢谢!

  • 相关阅读:
    openldap---ldapsearch使用
    自旋锁与相互排斥锁之抉择
    探索Android中的Parcel机制(上)
    我的Android开发相关文章
    SoftReference
    Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012
    机器学习中规则化和模型选择知识
    Java中System的详细用法
    Java中System的详细用法
    Java中System的详细用法
  • 原文地址:https://www.cnblogs.com/xcggdd/p/6097033.html
Copyright © 2011-2022 走看看