1.先上概念:
同一行为的多种不同表达,或者同一行为的多种不同实现就叫做多态
方法覆盖后出现的运行时多态,其运行规则是:编译时看数据类型,运行时看实际的对象类型(new谁调谁)
就是编译看左边,运行看右边。
2.多态的匹配:
- 确保参数完全匹配O的前提下,依次匹配this与super
- 考虑参数用super(O)渐近匹配O,依次匹配this与super
- 存在子类覆盖父类方法时,根据new子类实例的原则,先调子类方法
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 } }