java基础-多态

一、多态定义

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

       对于继承来说,

             父类 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在此不多说了.


望指正,谢谢.



版权声明:本文为u014371856原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。