向上类型转换:
1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。
2.父类引用变量无法调用子类新增成员变量和新增成员方法。
举个例子
public classAnimal {
public voidsleep() {
System.out.println("Animal sleep");
}
public voidjump(){
System.out.println("Animal jump");
}
}
class Tom extendsAnimal {
@Override
public voidsleep() {
System.out.println("Tom sleep");
}
public voidjump() {
System.out.println("Tom jump");
}
public static voidmain(String[] args) {
Animal animal = new Tom();//向上转型
animal.sleep();
// animal.jump();
// animal.jump(); 找不到这个方法
}
}
class Jerry extendsAnimal{
public voidsleep() {
System.out.println("Jerry sleep");
}
public voidjump() {
System.out.println("Jerry jump");
}
}
可以看到父类引用变量animal指向子类对象,Animal.sleep的结果是:
Tom sleep
而且animal不能调用子类中新增的方法,这是向上转型的不足之处,那么向上转型的作用体现在哪里呢?我们再创建一个类和一个测试类
public classAction{
public voidmotion(Tom tom){
tom.sleep();
}
public voidmotion(Jerry jerry){
jerry.sleep();
}
}
public classTest {
public static voidmain(String[] args) {
Tom tom = newTom();
Jerry jerry = newJerry();
Action action= newAction();
action.motion(tom);
action.mootion(jerry);
}
}
Action类中有多个motion()方法,feed()的参数都是Animal类的子类。如果频繁修改,代码可扩展性、可维护性差。如何优化呢,使用多态,同一个引用类型,使用不同的实例操作不同的对象;
修改Action类:
public class Action {
// public void motion(Tom tom){
// tom.sleep();
// }
//
// public void motion(Jerry jerry){
// jerry.sleep();
// }
public void motion(Animal animal){
animal.sleep();
}
}
修改完Action后结果是一样的,如此一来,无所谓有多少个子类继承Animal都不需要继续添加motion方法了。