java基础-多态

来源:互联网 发布:php 即时通讯插件 编辑:程序博客网 时间:2024/06/04 18:40

一、多态定义

       多态:同一个行为具有多个不同表现形式或形态的能力。

       对于继承来说,

             父类 a  = new 子类();

             a.子类重写的父类方法();

       这就是多态。只有在运行时才知道调用谁的方法,或者行为。

       比较经典的一句话:当超类对象引用变量引用子类对象时,被引用对象的类型决定了调用谁的成员方法,而不是引用变量的类型,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

      为什么???因为java继承中支持向上转型,父类的引用可以调用父类的属性方法,或者被子类重写的方法。对于子类中特别的方法或者属性,对父类来讲是不可见的。

       在继承相关的多态中,调用方法有一个优先级,this.XXX(A)---------->super.XXX(A)---------->this.XXX(super.A)---------->super.XXX(super.A).

       看到一个很经典的例子,在此为大家简单解释一下结果。

// A类:父类public class A {     public String show(D obj) {         return ("A and D");     }      public String show(A obj) {         return ("A and A");     }   }// A类的儿子public class B extends A{     public String show(B obj){         return ("B and B");     }          public String show(A obj){         return ("B and A");     }   }  //B类的儿子public class C extends B{}//B类的儿子public class D extends B{}

测试类:

public class Test {   public static void main(String[] args) {        A a1 = new A();        A a2 = new B();        B b = new B();        C c = new C();        D d = new D();        System.out.println("1--" + a1.show(b));      System.out.println("2--" + a1.show(c));      System.out.println("3--" + a1.show(d));      System.out.println("4--" + a2.show(b));      System.out.println("5--" + a2.show(c));      System.out.println("6--" + a2.show(d));      System.out.println("7--" + b.show(b));      System.out.println("8--" + b.show(c));      System.out.println("9--" + b.show(d));  }

测试结果:

1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D


结果分析:

调用链:this.XXX(@)---------->super.XXX(@)---------->this.XXX(super.@)---------->super.XXX(super.@).

1、2、3中都是A自己的引用,A自己的实例对象。this代表A.

      1.a1.show(b):A类中只有show(D)、show(A)方法。this.XXX(@)不存在,因为A类只有Object父类,super.XXX(@)不存在;

                               this.XXX(super.@),B类的父类是A类,在A类有show(A)方法,所以调用A类中的showA()

      2.a1.show(c):同1说明.区别在于c类时b的子类,b时A的子类.A中不含有this.(C)和this.(B),但是c也是A的子类,所以调用A的showA()

      3.a1.show(d):直接调用this.XXX(@)

456中都是A的引用,B的实例.实例对象决定调用谁的成员方法.this代表B

      4.a2.show(b):this.XXX(@)存在,但是在父类A中没有此方法,父类的引用对此方法不可见.super.XXX(@)也不存在;

                            this.XXX(super.@)存在:在b中定义了show(A)方法,所有调用B类中的show(A)方法

      5.a2.show(c):this.XXX(@)不存在,super.XXX(@)不存在,this.XXX(super.@)存在,b中有show(B),show(A),都是C的父类,调用哪个呢?同4


通过上述例子,应该差不多了解具体的调用过程和规则了.6,7,8,9在此不多说了.


望指正,谢谢.


1 0
原创粉丝点击