请老师帮忙看一下还需要改进吗?

请老师帮忙看一下还需要改进吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Test {
 
    public static void main(String[] args) {
        //生成父类对象数组,数组长度为5
        Animal animal[]=new Animal[5];
        //产生随机数,随机产生三种具体子类的实例
        for(int i=0;i<animal.length;i++){
            int temp=(int)(Math.random()*3);
            if(temp==0){
                animal[i]=new Cat();
            }else if(temp==1){
                animal[i]=new Dog(); 
                 
            }else if(temp==2){
                animal[i]=new Sheep();
            }
             
        }
       //循环输出,循环体中每个对象分别调用cry()方法。
        for(int i=0;i<animal.length;i++) {
            if(animal[i] instanceof Cat) {
                ((Cat)animal[i]).cry();
            }else if(animal[i] instanceof Dog) {
                ((Dog)animal[i]).cry();
            }else if(animal[i] instanceof Sheep) {
                ((Sheep)animal[i]).cry();
            }
        }
         
    }
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Animal {
private String kind;
     
    public Animal(){
         
    }
     
    //创建带参(king为参数)构造函数
    public Animal(String kind){
        this.kind=kind;
    }
 
    //应用封装实现对私有属性的get/set操作
    public void setKind(String kind){
        this.kind=kind;
    }
     
    public String getKind(){
        return kind;
    }
    //创建成员方法cry():void
    public void cry(){
         
    }
}
1
2
3
4
5
public class Cat extends Animal {
    public void cry(){
        System.out.println("小猫的叫声:喵喵喵~~~");
    }
}
1
2
3
4
5
6
public class Dog extends Animal {
    public void cry(){
        System.out.println("小狗的叫声:汪汪汪~~~");
    }
 
}
1
2
3
4
5
public class Sheep extends Animal {
    public void cry(){
        System.out.println("小羊的叫声:咩咩咩~~~");
}
}


正在回答 回答被采纳积分+1

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

1回答
irista23 2019-03-24 11:27:26

上述代码还有如下两处可以优化的地方:

1)多个else-if与数值判断时可以使用switch-case结构代替,使代码更简洁

http://img1.sycdn.imooc.com//climg/5c96f88b000146c006400332.jpg

2)这里调用的都是animal[i]的cry()方法,所以可以直接去掉if-else if结构判断,红框部分直接使用animal[i].cry();替换

http://img1.sycdn.imooc.com//climg/5c96f8d40001b1c607940266.jpg

  • 为什么红框部分直接使用animal[i].cry();替换?父类下面不是有三个类吗,不用instanceof怎么能知道它属于哪个子类?
    2020-02-29 22:44:29
  • 因为cry()是 Animal类里的方法,而这三个对象都属于Animal类型,所以可以直接调用,而不用去判断具体的子类。具体的子类,例如Cat也属于Animal
    2020-03-02 10:40:49
  • 哦,懂了,就是它们三个本来就是animal 所以判断不判断也无所谓了。不用去判断它属于的具体的子类。 但又感觉不对了,animal[i].cry();不去具体判断的话,机器怎么知道调用哪种animal的cry()方法呢。机器不会产生二义性吗
    2020-03-02 16:11:05
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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