老師我這樣寫可以嗎?向上轉型是這樣用嗎?
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(); } } }
41
收起
正在回答
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这句赋值了。
祝学习愉快!
相似问题
登录后可查看更多问答,登录/注册
Java零基础入门18
- 参与学习 人
- 提交作业 7317 份
- 解答问题 14452 个
想要入门学编程?多年一直活跃在编程语言排行版前列的Java是一个很好的选择。本路径将从Java基础语法、面向对象、常用工具类三部分,为你开启软件开发的大门!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星