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

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

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();
        	}
        }
        
	}

}
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(){
	    
	}
}
public class Cat extends Animal {
    public void cry(){
        System.out.println("小猫的叫声:喵喵喵~~~");
    }
}
public class Dog extends Animal {
    public void cry(){
        System.out.println("小狗的叫声:汪汪汪~~~");
    }

}
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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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