一个多态经典案例

时间:2022-06-22 14:11:44

1.先上概念:

同一行为的多种不同表达,或者同一行为的多种不同实现就叫做多态

方法覆盖后出现的运行时多态,其运行规则是:编译时看数据类型,运行时看实际的对象类型(new谁调谁)

就是编译看左边,运行看右边。

2.多态的匹配:

  1. 确保参数完全匹配O的前提下,依次匹配this与super
  2. 考虑参数用super(O)渐近匹配O,依次匹配this与super
  3. 存在子类覆盖父类方法时,根据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
	}
}