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)