代码:
class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 调用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子类覆写了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; public class PolDemo01{ public static void main(String asrgs[]){ B b = new B() ; // 实例化子类对象 A a = b ; // 向上转型关系 a.fun1() ; // 此方法被子类覆写过 //a.fun3() ;//报错,类没有这个方法 } }; 输出的结果是:B --> public void fun1(){}
代码:
class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 调用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子类覆写了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; public class PolDemo02{ public static void main(String asrgs[]){ A a = new B() ; // 向上转型关系 B b = (B)a ; // 发生了向下转型关系 b.fun1() ; b.fun2() ; b.fun3() ; } };
输出结果:
B------>fun1()
B------>fun1()
B------>fun3()
解释:
A a=new B();
执行过程是先产生B的对象,在产生过程中,fun1()方法已经被重写了
这个时候a即是A的实例,也是B的实例
即 a instanceof A==a instanceof B==true
所以之后的fun1()方法都是B中的。
代码:
class A{ // 定义类A public void fun1(){ // 定义fun1()方法 System.out.println("A --> public void fun1(){}") ; } public void fun2(){ this.fun1() ; // 调用fun1()方法 } }; class B extends A{ public void fun1(){ // 此方法被子类覆写了 System.out.println("B --> public void fun1(){}") ; } public void fun3(){ System.out.println("B --> public void fun3(){}") ; } }; public class PolDemo03{ public static void main(String asrgs[]){ A a = new A() ; // 实例化了一个父类对象 B b = (B)a ; // 发生了向下转型关系 b.fun1() ; b.fun2() ; b.fun3() ; } };
无法执行,报错,无法从父类转为子类,因为子类中有父类没有的东西。只能减少,不能增加。
总结,父类不能强制转为子类,但是子类可以强制转为父类,在实现的过程中,只要实例化了子类的对象,而且这个方法刚好被重写的话,那么输出的必定是重写过后的方法。