A为父类,子类B、C
第20行发生向上转型,a对象调用C覆写过的print()方法
若为A a = new B(); 则调用B覆写过的print()方法
创建对象时使用向上转型,能够统一参数类型(23行),便于程序设计
1 package inheritance; 2 3 class A{ 4 public void print() { 5 System.out.println("A.pirnt"); 6 } 7 } 8 class B extends A{ 9 public void print() { 10 System.out.println("B.print"); 11 } 12 } 13 class C extends A{ 14 public void print() { 15 System.out.println("C.print"); 16 } 17 } 18 public class TestDemo { 19 public static void main(String args[]) { 20 A a1 = new B(); 21 A a2 = new C(); 22 fun(a1); 23 fun(a2); 24 System.out.println(a1 instanceof A); 25 System.out.println(a1 instanceof B); 26 System.out.println(a1 instanceof C); 27 } 28 public static void fun(A a) { 29 a.print(); 30 } 31 }
结果:
B.print
C.print
true
true
false
如果子类有自己的特殊方法,没有在父类中定义,则父类访问子类的方法需要将父类对象向下转型:B b = (B) a,但这样会破坏参数的统一性,所以在开发中不建议使用
原则:以父类方法为主,子类可以覆写父类方法,但尽量不要扩充新方法