作业 3-16

来源:3-16 编程练习

jia_蛙

2019-08-02 16:56:50

package com.zhou.animals;
/**
 * Animal 父类
 * @author 25677
 *
 */
public class Animal {
	//属性: kind 种类
	private String kind;
	
	//无参构造
	public Animal() {
		
	}
	//带参构造:种类
	public Animal(String kind) {
		this.setKind(kind);
	}
	
	
	//getter setter
	public String getKind() {
		return kind;
	}

	public void setKind(String kind) {
		this.kind = kind;
	}
	
	//cry() 无返回值
	public void cry() {
		System.out.println("动物都会叫喊");
	}
}
package com.zhou.animals;
/**
 * Cat 子类
 * @author 25677
 *
 */
public class Cat extends Animal {
	@Override
	public void cry() {
		System.out.println("小猫的叫声:喵喵喵~~~");
	}
}
package com.zhou.animals;
/**
 *  Dog 子类
 * @author 25677
 *
 */
public class Dog  extends Animal{
	@Override
	public void cry() {
		System.out.println("小狗的叫声:汪汪汪~~~");
	}

}
package com.zhou.animals;
/**
 * Sheep 子类
 * @author 25677
 *
 */
public class Sheep  extends Animal{
	@Override
	public void cry() {
		System.out.println("小羊的叫声:咩咩咩~~~");
	}

}
package com.zhou.animals;
/**
 * 测试类
 * @author 25677
 *
 */
public class Test {
	public static void main(String[] args) {
		//首先生成长度为5的父类对象数组
		Animal[] animals = new Animal[5];
		
		for(int i = 0; i<animals.length;i++) {
			//生成0-2随机数
			int b =  (int)(Math.random()*3);
			//保存进数组中去
			for(int a = 0; a<animals.length; a++) {
				if(animals[a] == null) {
					animals[a] = save(a);
					save(a).cry();
				}
			}
		}
	}
	
	 public static Animal save(int a) {
		 if(a == 0) {
			 return new Cat();
		 }else if(a == 1) {
			 return new Dog();
		 }else {
			 return new Sheep();
		 }
	 }	
	
}
写着个题目好像没什么思路 ,不知道怎么写, 然后跟着任务分析写成这样,除了这个静态方法 返回的时候是返回
的Animal 类型的 有一个向上转型,我这里好像就没用到多态的东西了,总感觉我写的有问题,老师你帮我看看,
指点一下。


写回答

1回答

好帮手慕珊

2019-08-02

同学,你好!我们的任务分析其实就是思路啦。代码整体写得还是很不错的,Test类有些问题,如下所示的代码:第一个save(a)改成save(b),通过随机数b生成对象。第二个save(a)改成animal[a],不要再重新调用save(a)了,会生成新的对象

http://img.mukewang.com/climg/5d4414bc00015c1403750186.jpg

这样使用其实已经用到了多态,因为Animal数组元素都是Animal类的引用,而把对象的值赋值给了数组元素,也就是父类Animal的引用指向了子类的对象,然后根据子类对象的不同去调用子类的方法。

题目要求是先循环生成对象,再用一个循环去调用方法,你都写在一起了。这样做也没关系,但可以使用一个for循环完成。改正后的Test类代码如下,注意看注释:

package com.zhou.animals;
/**
 * 测试类
 * 
 * @author 25677
 *
 */
public class Test {
public static void main(String[] args) {
// 首先生成长度为5的父类对象数组
Animal[] animals = new Animal[5];
//for (int i = 0; i < animals.length; i++) {
// 生成0-2随机数
//int b = (int) (Math.random() * 3);
// 保存进数组中去
for (int a = 0; a < animals.length; a++) {
int b = (int) (Math.random() * 3);
//if (animals[a] == null) {
animals[a] = save(b);//将之前的a改成b,根据b随机生成
//save(a).cry();
animals[a].cry();//通过数组元素去调用cry(),不要再用save方法,会重新产生一个新对象
//}
}
//}
}
public static Animal save(int a) {
if (a == 0) {
return new Cat();
} else if (a == 1) {
return new Dog();
} else {
return new Sheep();
}
}
}

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

1

0 学习 · 11489 问题

查看课程