java向上转型和向下转型

时间:2023-02-25 18:22:02

1.向上转型:就是你定义了一个子类对象但是声明它的类型为父类的 Parent object = new Child(); 本来是一个子类对象,却是父类类型的,这不就是向上转型了么。 不用强制转换
2.向下转型:向下转型就相反,创建父类的对象,声明为子类类型 Child obj = (child)object ;object 是刚才创建的父类对象 强制转换


注意:
1.向上转型的父类类型子类对象只能调用父类的方法,如果子类重写了父类方法的话,name*调用的是子类的方法*,也就是说除了与父类同名的方法,其他子类扩展的方法全浪费了。。
2.向下转型的 子类类型父类方法可以调用父类方法,也可以调用子类方法*,但是不能调用父类中的私有方法,即*private声明的方法,如果子类重写父类方法,那么调同名方法其实调用的是子类的方法。

——————————示例代码如下———————————————————–


public class PandaTest {//父类
    public static void main(String args[]) {
        PandaTest panda = new pandaChild();//向上转型 定义一个父类类型的子类对象,只能引用父类中的方法
        panda.talk();//如果子类重写则调用子类方法
        pandaChild panda2 = (pandaChild)panda;//向下转型 定义一个子类类型的父类对象,既可以引用父类方法,也可以调子类方法
        panda2.speak();
        panda2.talk();//如果子类重写则调用子类里的方法
       //不能调用父类中私有方法
    }
    public void talk(){
        System.out.println("i am a panda parent");
    }
    private void cry(){ //父类私有方法
        System.out.println("i am a crying panda");
    }
}
class pandaChild extends PandaTest{//子类 继承了父类
    pandaChild(){//无参构造方法

    }
    public void talk(){//重写父类方法
        System.out.println("i am a panda child");
    }
    public void speak(){//子类自己的方法
        System.out.println("i am a panda child who is confident");
    }

}

运行结果:
i am a panda child //这个是向上转型的panda对象调用子类重写了父类talk()方法
i am a panda child who is confident //这个是向下转型的panda2对象调用子类的speak()方法
i am a panda child//这个是向下转型的panda2对象调用子类重写了父类talk()方法


tip: 在写代码时,eclipse有个快捷键,就是敲完对象.之后按alt+?就会提示所有对象能调用的方法,
你会发现panda2.之后没有父类的cry()方法,就是说向下转型的对象不能调用父类中private 方法。


你可能发现了向下转型是这样写的 pandaChild panda2 = (pandaChild)panda;而不是pandaChild panda3 = (pandaChild)new PandaTest();后面写法编译没问题,运行时就报错了:

childException in thread "main" java.lang.ClassCastException: PandaTest cannot be cast to pandaChild
    at PandaTest.main(PandaTest.java:9)