3-12编程练习中使用instanceof运算符有什么意义?

3-12编程练习中使用instanceof运算符有什么意义?

使用instanceof进行强制类型转换判断:

for(int i=0;i<5;i++){
        if(animal[i] instanceof Cat){
            Cat cat=(Cat)animal[i];
            cat.cry();
        }
         if(animal[i] instanceof Dog){
            Dog dog=(Dog)animal[i];
            dog.cry();
        }
         if(animal[i] instanceof Sheep){
            Sheep sheep=(Sheep)animal[i];
            sheep.cry();
        }
    }

直接访问animal[i]的方法进行输出:

public class Test {

    public static void main(String[] args) {
        //生成父类对象数组,数组长度为5
        Animal[] animal=new Animal[5];
        //产生随机数,随机产生三种具体子类的实例
        for(int i=0;i<5;i++){
            int temp=(int)(Math.random()*3);
            switch(temp){
                case 0:{
                    animal[i]=new Cat();
                    break;
                }
                case 1:{
                    animal[i]=new Dog();
                    break;
                }
                case 2:{
                    animal[i]=new Sheep();
                    break;
                }
            }
        }
       //循环输出,循环体中每个对象分别调用cry()方法。
    for(int i=0;i<5;i++){
        animal[i].cry();
    }

    }

}

循环输出的时候,只要子类重写了父类的cry方法,通过父类对象animal[i]访问到的cry方法就是它子类的cry方法吧。就像我上面写的那样,运行出来也是正确的。是不是编译器会自动判断animal[i]属于哪一个子类的储存空间?求解答,谢谢♪(・ω・)ノ

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

比如animal[i] instanceof Cat,instanceof是判断animal[i]是否为Cat类型的。

当子类重写了父类的cry()方法,父类引用指向子类对象,调用cry()方法时会调用子类重写的cry()方法,这是多态的体现。祝学习愉快~

  • Giorin 提问者 #1
    谢谢,我的疑惑在于,好像不用向下转型,就可以直接调用Animal类对象就能调用子类重写的cry()方法,为什么还要用instanceof判断能否向下转型呢?
    2018-03-11 13:55:54
  • 好帮手慕珊 回复 提问者 Giorin #2
    这道题不用也可以,但是有时候不是调用重写父类的方法,而是子类特有的方法,这时候就要用instanceof,确保是该子类的对象。还有就是,传进来的是Cat的对象,而此时调用的是Dog类的方法,这时候如果没有使用instanceof就会报错。祝学习愉快!
    2018-03-12 09:29:50
  • Giorin 提问者 回复 好帮手慕珊 #3
    明白了,谢谢!
    2018-03-12 14:48:58
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师