我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。再例如,麻雀是鸟类的一种(鸟类的子类),而鸟类则是动物中的一种(动物的子类)。我们现实中也经常这样说:麻雀是鸟。这两种说法实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想。
Pet pet=new Dog("欧欧", "雪纳瑞");//向上转型
pet.eat();//会调用Dog类重新的eat()方法,而不是Pet类的eat()方法
peg.catchingFlyDisc();//编译错误,父类的引用无法调用与子类特有的方法
子类转型成父类是向上转型,反过来说,父类转型成子类就是向下转型。但是,向下转型可能会带来一些问题:我们可以说麻雀是鸟,但不能说鸟就是麻雀。
Dog dog=(Dog)pet;//向下转型,编译无错误,运行时无错误
dog.eat();//调用父类方法
dog.catchingFlyDisc();//调用Dog类方法
Pet pet2=new Pet();// 向下转型,编译无错误,运行时将出错
Dog dog2=(Dog)pet2;
dog2.print();