java 多态中的向上转型和向下转型

来源:互联网 发布:匿名聊天源码 编辑:程序博客网 时间:2024/06/04 19:42

什么是向上转型?

答:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口

向上转型的优势和劣势?

优势:1.减少重复代码,使代码变得简洁

         2.提高系统的可扩展性

劣势:1.向上转型时子类单独定义的方法会丢失,例如下面,new Dog后,用对象来调用Dog中的run方法就找不到

          2.父类不能引用子类的对象 例如:Cat c = (Cat) new Animal(); 这样就会出现错误


package com.java1234.jichu;


public class DuoTai {
    
    public static class Animal{
        public void eat(){
            System.out.println("animal eatting...");
        }
    }
    
    
    public static class Cat extends Animal{
        public void eat(){
            System.out.println("我吃鱼...");
        }
    }
    
    public static class Dog extends Animal{
        public void eat(){
            System.out.println("我吃骨头...");
        }
        public void run(){
            System.out.println("我会跑...");
        }
    }
    
   /**
     * 将子类对象Cat转化为父类对象Animal
     * 这个时候animal这个引用调用的方法是子类方法。
     * @param @param args
     * @return void
     * @author jiangxueyou
     */
    public static void main(String[] args) {
        Animal animal = new Cat();//向上转型
        animal.eat();
        
        animal = new Dog();
        animal.eat();
        //animal.run            //子类单独定义的方法会丢失。
        
        Cat c = (Cat) new Animal();//子类引用不能指向父类对象
        c.eat();
    }

}

什么是向下转型?

答:向下转型是把父类对象转为子类对象。(请注意!这里是有坑的。)

//还是上面的animal和cat dog
Animal a = new Cat();
Cat c = ((Cat) a);
c.eat();
//输出  我吃鱼
Dog d = ((Dog) a);
d.eat();
// 报错 : java.lang.ClassCastException:com.chengfan.animal.Cat cannot be cast to com.chengfan.animal.Dog Animal a1 = new Animal();
Cat c1 = ((Cat) a1);
c1.eat();
// 报错 : java.lang.ClassCastException:com.chengfan.animal.Animal cannot be cast to com.chengfan.animal.Cat

为什么第一段代码不报错呢?相比你也知道了,因为a本身就是Cat对象,所以它理所当然的可以向下转型为Cat,也理所当然的不能转为Dog,你见过一条狗突然就变成一只猫这种操蛋现象?

而a1为Animal对象,它也不能被向下转型为任何子类对象。比如你去考古,发现了一个新生物,知道它是一种动物,但是你不能直接说,啊,它是猫,或者说它是狗。

向下转型注意事项:

向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)也就是必须这样Animal a = new Cat();

向下转型只能转型为本类对象(猫是不能变成狗的)。

例如 Animal a = new Cat(); 

那么向下转型只能是 Cat c = ((Cat) a); 而不能Dog d = ((Dog) a);

向下转型的作用:举例说明

public class DuoTai2 {

    public void eat(Animal a) {
        if (a instanceof Dog) {
            Dog d = (Dog) a;
            d.eat();
            d.run();
            // 狗有一个跑的方法
        }
        if (a instanceof Cat) {
            Cat c = (Cat) a;
            c.eat();
            System.out.println("我也想跑,但是不会"); // 猫会抱怨
        }
        a.eat();// 其他动物只会吃
    }
}


原创粉丝点击