代码:this
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(){}
代码:spa
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() ; } };
输出结果:code
B------>fun1()对象
B------>fun1()blog
B------>fun3()class
解释:方法
A a=new B();总结
执行过程是先产生B的对象,在产生过程当中,fun1()方法已经被重写了static
这个时候a便是A的实例,也是B的实例di
即 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() ; } };
没法执行,报错,没法从父类转为子类,由于子类中有父类没有的东西。只能减小,不能增长。
总结,父类不能强制转为子类,可是子类能够强制转为父类,在实现的过程当中,只要实例化了子类的对象,并且这个方法恰好被重写的话,那么输出的一定是重写事后的方法。