关闭

JAVA多态学习2

标签: java多态向上转型向下转型
364人阅读 评论(0) 收藏 举报
分类:

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

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

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在对象类型的强制转换,先判断是否是某种类型,是的话再强制转换成改类型。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18890次
    • 积分:451
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:25篇
    • 译文:1篇
    • 评论:0条
    文章存档