首先来看一个经典的例子
public class Polymorphic {
class A {
public void show(D obj) { System.out.println ("A show D"); }
public void show(A obj) { System.out.println ("A show A"); }
}
class B extends A {
public void show(B obj) { System.out.println ("B show B"); }
public void show(A obj) { System.out.println ("B show A"); }
}
class C extends B {}
class D extends B {}
public static void main(String[] args) {
Polymorphic polymorphic = new Polymorphic();
A a = polymorphic.new A();
A a_b = polymorphic.new B();
B b = polymorphic.new B();
C c = polymorphic.new C();
D d = polymorphic.new D();
a.show(a); // A show A
a_b.show(a); //① B show A
a_b.show(b); //② B show A
a_b.show(c); //③ B show A
a_b.show(d); //④ A show D
}
}
原因
java多态的理解
首先,要看a_b被声明为A类型即用父类型声明变量。所以a_b是按照A类型进行编译链接和调用的,
即a_b对象只有show(A) show(D)两个公开方法,且show(A)是被实际类型B进行覆盖的。
a_b.show(a); //① B show A 按照show(A)调用覆盖的方法。
a_b.show(b); //② B show A 按照show(A)调用覆盖的方法。因为show(B)方法不可见。
a_b.show(c); //③ B show A 按照show(A)调用覆盖的方法。因为show(C)不存在show(B)方法不可见。
a_b.show(d); //④ A show D 按照show(D)调用父类方法。
原文:https://www.cnblogs.com/libai2020/p/14019015.html