老師我這樣寫可以嗎?向上轉型是這樣用嗎?

老師我這樣寫可以嗎?向上轉型是這樣用嗎?

package com.imooc.demo;

public class Animal {
	
	//属性:kind(种类)
	private String kind;
	
	public Animal(){
		
	}
    
	//创建带参(king为参数)构造函数
	
	public Animal(String kind){
		this.setKind(kind);
	}

    //应用封装实现对私有属性的get/set操作
	
	public String getKind() {
		return kind;
	}

	public void setKind(String kind) {
		this.kind = kind;
	}
	

	//创建成员方法cry():void
	public void cry() {
		
	}

	
	
}
public class Cat extends Animal {
	 //重写父类cry()方法,输出信息为“小猫的叫声:喵喵喵~~~”
	@Override
	public void cry() {
		System.out.println("小猫的叫声:喵喵喵~~~");
	}
}
public class Dog extends Animal {
	//重写父类cry()方法:输出信息为“小狗的叫声:汪汪汪~~~”
	@Override
	public void cry() {
		System.out.println("狗的叫声:汪汪汪~~~");
	}
}
public class Sheep extends Animal {
	//重写父类的方法cry(),要求输出信息“小羊的叫声:咩咩咩~~~”
	@Override
	public void cry() {
		System.out.println("小羊的叫声:咩咩咩~~~");
	}
}
public class Test {

	public static void main(String[] args) {
		//生成父类对象数组,数组长度为5
		Animal[] arr=new Animal[5];
		
		//产生随机数,随机产生三种具体子类的实例
		
		for(int i=0 ; i<=2 ;i++) {
			
			int num = (int)(Math.random()*3);
			System.out.println("num==>"+num);
					
			//實例化 Aimal (向上轉型)??
			
			Animal temp= new Animal();
			if(num==0) {
				temp = new Cat();
			}else if(num==1) {
				temp = new Dog();
			}else if(num==2) {
				temp = new Sheep();
			}
			
			arr[i] = temp;	
			
		}


       //循环输出,循环体中每个对象分别调用cry()方法。
		for(int i =0;i<3;i++) {
			arr[i].cry();
		}

	}

}


正在回答

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

1回答

1、因为数组arr的长度是5,所以,在你的第一个for循环中的判断条件i<=2应该修改为i<5,同理,第二个for循环的判断条件i<3也应该修改为i<5。

2、在第一个for循环中,建议不要再创建Animal对象了,因为,你已经在for循环外面定义了Animal类型的数组,因此,在for循环中,就可以直接使用数组去接收子类,譬如:在if(num==0)的语句块中,可以直接使用数组接收,即arr[i]= new Cat(),最后,就可以去掉 arr[i] = temp这句赋值了。

祝学习愉快!

  • 叮叮喵 提问者 #1
    非常感谢老師!我發現我的問題在哪裡了!!!
    2017-08-11 08:10:12
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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