1:作用
可以消除类型之间的耦合关系。
2:动态绑定(即多态)
在运行期才知道对象的类型(或才知道调用的是哪个对象的方法)
在java中除了static和final(private 也是final的)之外,都是动态绑定
3:缺点:
1):父类与子类有同名方法,但父类方法为private的,把子类对象赋值给父类字段,调用同名方法是父类的方法(private方法不能被重载)
2):多态不会发生在private,域,静态方法中
4:构造方法和多态
构造方法并不具有多态性(构造方法是static)
构造方法的初始化顺序(有了多态之后)
1):基类的构造器初始化(返复递归直到最底层的基本构造器)
2):成员字段的构造器(用来确保字段都可以被正确的初始化)
3):自己的构造器
继承与清理的顺序
子类的清理方法中最后一行一定要调用父类的清理方法(否则父类的清理方法将永远不被调用)
对于基类:销毁的顺序先子类后父类
5:协变返回值类型
子类中被覆盖的方法,可以返回基类方法返回值的子类型
一个例子:
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{
}
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)); //A类中没有参数为b的方法,但有参数为b的父类的方法,所以调用它
System.out.println("2--" + a1.show(c)); //A类中没有参数为c的方法,但有参数为c的父类的方法,所以调用它
System.out.println("3--" + a1.show(d)); //A类中有参数为d的方法,所以调用它
//a2对象是B类,但使用A类的“接口”调用(它访问不到B类的特有方法),B类是A的子类,所以参数为a的方法被覆盖
System.out.println("4--" + a2.show(b)); //B类中有参数为b的方法,但a类中没有,所以访问不到;它还有参数为b的父类(a)的方法,所以调用被覆盖的方法
System.out.println("5--" + a2.show(c)); //B类中没有参数为c的方法,但有参数为b的父类(a)的方法,所以调用被覆盖的方法
System.out.println("6--" + a2.show(d)); //B类中没有参数为d的方法,但父类中有,所以调用它
System.out.println("7--" + b.show(b)); //B类中有参数为b的方法,所以调用它
System.out.println("8--" + b.show(c)); //B类中没有参数为c的方法,其父类也没有,查看它有参数为c的父类的方法,所以调用它
System.out.println("9--" + b.show(d)); //B类中没有参数为d的方法,但其父类有,所以调用它
}
}
补充:
所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。
抄自:http://blog.csdn.net/chenssy/article/details/12786385