JAVA多态学习2

好啦,这里紧接着上次没说的向下转型,请读者结合上次讨论的向上转型的样例一起探讨(事实上本次代码也有加上,放心)。

我们这里希望从向下转型会出现的两种基本情况进行探讨

package downcasting;


//动物类Animal父类
class Animal{
    String name;
    int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    //动物会叫
    public void cry(){
        System.out.println("不知道怎么叫");
    }
    //动物吃东西
    public void eat(){
        System.out.println("不知道吃什么");
    }
}
//创建Dog子类并extends继承Animal父类及覆盖cry方法
class Dog extends Animal{
    //狗叫
    public void cry(){                         //覆盖父类方法
        System.out.println("汪汪叫");
    }
    //狗吃东西
    public void eat(){                          //覆盖父类方法
        System.out.println("狗爱吃骨头");        
    }
    public void bite(){

        System.out.println("狗会咬人...");
    }
}

public class Downcasting {

    public static void main(String[] args) {
        // TODO 自己主动生成的方法存根

           Animal g1=new Dog();  //向上转型
           g1.cry();
           g1.eat();
           /*
            * 情况一:假设父类引用的对象假设引用的是指向的子类对象,
            * 那么在向下转型的过程中是安全的。也就是编译执行是不会出错误的
            */
           Dog dog=(Dog)g1;         //向下转型,编译和执行皆不会出错
           dog.cry();

           dog.eat();

           Animal g2=new Animal();

           /*
            *情况二:假设父类引用的对象是父类本身,那么在向下转型的过程中是不安全的。
            *编译不会出错,可是执行时会出现java.lang.ClassCastException错误。
            *它能够使用instanceof来避免出错此类错误。
            * */

         /*
          *错误例如以下: Exception in thread "main" java.lang.ClassCastException:
          *         downchange.Animal cannot be cast to downchange.Dog
                    at downchange.Downchange.main(Downchange.java:62)


           Dog dog1=(Dog)g2;
           dog1.cry();
           dog1.eat();

           */


           if(g2 instanceof Dog){

                    Dog dog1=(Dog)g2;
                    dog1.cry();
                    dog1.eat();
           }
           else if(g2 instanceof Animal){
               System.out.println("g2是Animal的实例");}

           //Dog g3=new Animal();   //不存在从Animal转换到Dog
    }

}

向下转型

ps:
instanceof:
1.用instanceof来測试它所指向的对象是否是某个类。
2.instanceof在对象类型的强制转换,先推断是否是某种类型,是的话再强制转换成改类型。

原文地址:https://www.cnblogs.com/liguangsunls/p/7100737.html