1.先上概念:
同一行为的多种不同表达,或者同一行为的多种不同实现就叫做多态
方法覆盖后出现的运行时多态,其运行规则是:编译时看数据类型,运行时看实际的对象类型(new谁调谁)
就是编译看左边,运行看右边。
2.多态的匹配:
3.动态绑定(了解即可):
方法调用和方法体在运行时刻的连接就称之为动态绑定(dynamic binding)
动态绑定,它意味着绑定在运行期间进行,以对象的类型为基础。动态绑定也叫做“后期绑定”或“运行期绑定”。
若一种语言实现后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息
Java中绑定的所有方法都采用后期绑定技术,除非一个方法已被声明成final。这意味着我们通常不必决定是否应进行后期绑定——它是自动发生的
//A相当于爷爷类,B相当于父亲类,B继承A
//C,D相当于儿子类,都继承B
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(a1.show(b)); // ① A and A
System.out.println(a1.show(c)); // ② A and A
System.out.println(a1.show(d)); // ③ A and D
System.out.println(a2.show(b)); // ④ B and A
System.out.println(a2.show(c)); // ⑤ B and A
System.out.println(a2.show(d)); // ⑥ A and D
System.out.println(b.show(b)); // ⑦ B and B
System.out.println(b.show(c)); // ⑧ B and B
System.out.println(b.show(d)); // ⑨ A and D
}
}