一、多态定义
多态:同一个行为具有多个不同表现形式或形态的能力。
对于继承来说,
父类 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(@)
4、5、6中都是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在此不多说了.
望指正,谢谢.