Java向上转型

 


 

向上类型转换:
1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。 
2.父类引用变量无法调用子类新增成员变量和新增成员方法。

 


 

举个例子

 


 

public class Animal {

    public void sleep() {
        System.out.println("Animal sleep");
    }

    public void jump(){
        System.out.println("Animal jump");
    }
}

class Tom extends Animal {
    @Override
    public void sleep() {
         System.out.println("Tom sleep");
    }

    public void jump() {
         System.out.println("Tom jump");
    }

    public static void main(String[] args) {
         Animal animal = new Tom();//向上转型
         animal.sleep();
//        animal.jump();
//       animal.jump(); 找不到这个方法
    }
}
class Jerry extends Animal{
    public void sleep() {
        System.out.println("Jerry sleep");
    }

    public void jump() {
        System.out.println("Jerry jump");
    }
}

 

 

 

 


  可以看到父类引用变量animal指向子类对象,Animal.sleep的结果是:


 

Tom sleep

 


 

  而且animal不能调用子类中新增的方法,这是向上转型的不足之处,那么向上转型的作用体现在哪里呢?我们再创建一个类和一个测试类


 

public class Action{
    public void motion(Tom tom){
        tom.sleep();
    }

    public void motion(Jerry jerry){
        jerry.sleep();
    }
}

 


 

public class Test {
    public static void main(String[] args) {

        Tom tom = new Tom();
        Jerry jerry = new Jerry();
        Action action= new Action();

        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方法了。

 

 

 

 

 
posted @ 2019-01-05 11:45  中华小菜鸟  阅读(306)  评论(0)    收藏  举报