• java 多态性


    参考:

    http://www.cnblogs.com/qinqinmeiren/archive/2011/07/15/2151687.html

    定义:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。

    表现:重载,重写

    引用一个经典多态的例子:来源于:

    http://blog.csdn.net/thinkGhoster/archive/2008/04/19/2307001.aspx

    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 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));   ①
            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));     ⑨    
    (三)答案

    ①   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

    分析4:

    a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。

    总结分析原则:

    1.涉及方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

    2.看此对象是否引用的是其他对象

  • 相关阅读:
    在Django中如何使用Redis
    Redis的基本操作
    短信接口的频率限制
    版本控制器git
    windows生成公私钥以及应用
    luffy前台组件的搭建
    周末大作业
    同源策略的解决方案
    全局Response对象和全局异常捕获和日志
    爬虫之代理池搭建
  • 原文地址:https://www.cnblogs.com/wjw334/p/3591942.html
Copyright © 2020-2023  润新知