向上转型 将子类对象当作父类对象 子类对象------>父类对象
先实例化子类
父类 父类对象 = 子类实例
package test2; class Father{ public void fun1(){ System.out.println("A---------fun 1"); } public void fun2(){ this.fun1();; } } class Sun extends Father{ public void fun1(){ System.out.println("B---------fun 1"); } public void fun3(){ System.out.println("B---------fun 3"); } } public class PolDemo02 { public static void main(String args[]){ Sun b = new Sun(); //实例化子类 b Father a= b; //父类 父类对象= 子类 a.fun1(); //父类对象调用是险 } //发生了向上转型,则一定调用的是被子类覆写的对象,同时 此时的a对象是无法调用fun3()的因为 //此方法只在子类中,所以要调用fun3(),肯定要实例化子类,所以,可以将对象向下转型。 }
向下转型
将父类对象当做子类对象 子类 子类对象 = (子类)父类实例。
package test2; class Father{ public void fun1(){ System.out.println("A---------fun 1"); } public void fun2(){ this.fun1();; } } class Sun extends Father{ public void fun1(){ System.out.println("B---------fun 1"); } public void fun3(){ System.out.println("B---------fun 3"); } } public class PolDemo02 { public static void main(String args[]){ Father a = new Sun(); //此时 先由new 一个子对象,然后由A a = new b()发生向上转型, 子类--------> 父类 Sun b = (Sun)a; // 子类 子类对象 = (子类)父类对象 父类---------->子类 此时发生了向下转型关系 b.fun1(); //父类类型调用fun1()此时 调用的方法是发生覆写过的 b.fun2(); //调用父类方法 b.fun3(); //调用子类自己定义的方法 } }
在进行对象的向下转型之间,必须先发生向上转型,
父类用其自己实例化自己的对象,但是他并不知道谁是自己的子类,,所以再发生向下转型时,需要先发生向上转型 ,及A a = New B() ,将父类和子类之间建立关系。