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

阅读更多
个人分类: Java
上一篇JAVA多态学习1
下一篇JAVA多态学习3
想对作者说点什么? 我来说一句

java多态

2012年08月29日 565KB 下载

Java多态的讲解

2017年07月01日 2KB 下载

Java多态实现

2012年08月29日 45KB 下载

C++和Java多态的区别

2016年11月27日 955KB 下载

没有更多推荐了,返回首页

关闭
关闭