3-16的编程练习

3-16的编程练习

代码只能写到这里了,不知道哪里错误:

先把任务要求贴出来:

任务分析:

1.      定义一个父类Animal类

属性:kind(种类)

方法:创建带参(kind为参数)构造方法

            创建cry():void方法


2.      编写三个具体的子类Cat类、Dog类、Sheep类

分别重写父类中的 cry() 方法,输出信息分别为

Cat类:小猫的叫声:喵喵喵~~~

Dog类:小狗的叫声:汪汪汪~~~

Sheep类:小羊的叫声:咩咩咩~~~


3.      编写测试类,首先生成长度为5的父类对象数组,然后通过循环依次向数组中存入数据,现设定存储规则为:

a)      每次随机产生一个0~2的正整数

b)     若数值为 0,则生成一个 Cat 类的对象,存入数组

c)      若数值为 1,则生成一个 Dog 类的对象,存入数组

d)     若数值为 2,则生成一个 Sheep 类的对象,存入数组

最后循环输出数组成员,并分别调用 cry() 方法。

  

测试类
import java.util.Random;
public class Test {


    public static void main(String[] args) {
        //生成父类对象数组,数组长度为5
        Animal[] animal=new Animal[5];
        //产生随机数,随机产生三种具体子类的实例
       
        for(;;){
             Random random=new Random(3);
            if(random==0)
                animal[0]=new Cat();
            if(random==1)
                animal[1]=new Dog();
            if(random==2)
                animal[2]=new Sheep();
            if(animal[0]!=null &animal[1]!=null &animal[2]!=null)
                break;
        }

       //循环输出,循环体中每个对象分别调用cry()方法。



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

        //应用封装实现对私有属性的get/set操作
        public void setKind(String kind){
            this.kind=kind;
        }
        
        public String getKind(){
            return this.kind;
        }
        //创建成员方法cry():void
        public void cry(){
            
        }


    }
    
    
    
猫类   
    public class Cat extends Animal {
        //重写父类cry()方法,输出信息为“小猫的叫声:喵喵喵~~~”
         public void cry(){
             System.out.println("小猫的叫声:喵喵喵");
         }


    }
    
    
    
    
 狗类   
    public class Dog extends Animal {
        //重写父类cry()方法:输出信息为“小狗的叫声:汪汪汪~~~”
        public void cry(){
            System.out.println("小狗的叫声:汪汪汪————");
        }


    }
    
    
    
 羊类   
    public class Sheep extends Animal {
        //重写父类的方法cry(),要求输出信息“小羊的叫声:咩咩咩~~~”
       public void cry(){
           System.out.println("小羊的叫声:咩咩咩————");
       }



   }
   



正在回答

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

5回答

同学你好,1、关于int a=(int)((Math.random()*3)+1);语句中,Math类调用random方法时,老师是在写完实例化Random类,调用Random类中的nextInt()方法的情况下,忘记删除了,直接写了int a=(int)((Math.random()*3)+1);,给同学造成的误解非常抱歉!

2、关于Math和Random的导包问题,有如下解释:Math不需要导包是因为Math类属于lang包下的类,Java中的所有程序都默认导入lang包,不用写导入lang包,而Random类属于util包,没有默认导入,所以需要导入util包才能使用哦!

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

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

3、Math.random()中的random方法是Math中的静态方法,可以直接调用,与Random类没有关系哦!

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

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

好帮手慕小班 2019-05-17 11:21:14

同学你好,1、关于Random random=new Random();----》int a=random.nextInt(3)这样的写法是正确的哦!

2、使用Random生成非0正整数的写法也是正确的哦!例如:

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

3、同学使用Math.random()也是可以的,例如:

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

这两种写法都是可以的哦!非常棒哦~~  继续加油

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


  • 提问者 鱼儿0001 #1
    谢谢老师的耐心回复和贴图,我看到一点你写的代码的问题,可能也不算吧。int a=(int)((Math.random()*3)+1);这个代码,我删除了import java.util.Random和Random random=new Random();我运行了一下,没问题。这说明Math.random()不需要上述导入和new Random();。老师的代码里写了new Random()。老师同样是random,导入的Random random=new Random()和不必导入便可以使用的Math.random();有什么区别?
    2019-05-17 11:49:34
好帮手慕小班 2019-05-16 19:49:19

同学你好,1、关于Math.random的理解,你是正确的,而且题目中也要求我们生成的是0、1、2这样的整型的随机数。

2、Random的另一种写法是:

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

这里,a=random.nextInt(3);是生成从0到3的随机数,上限为3,但是不等于3哦!也就是[0,3);

3、break语句用在if结构中也是跳出if的结构!

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

  • 提问者 鱼儿0001 #1
    谢谢老师。老师,1、在这里使用Random random=new Random();----》int a=random.nextInt(3),可以吗?看起来nexInt好像生成的也是整数。。。2、还有,老师,如果我想生成一个非0的正整数,是不是写成: int a=random.nextInt(3)+1---》这种形式?它的区间是:[1,4).3、同样的,(int)((Math.random()*3)+1),老师,这样是不是也能得到非0的正整数?
    2019-05-17 09:34:04
好帮手慕小班 2019-05-16 17:54:53

同学你好,1、声明定义数组长度为5是题目要求的,例如:

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

2、生成一个0~2的随机正整数,Math.random是生成大于等于0.0且小于1.0的随机数,将这个随机数乘以3,强转为int后会得到一个0~2的随机数,例如:

生成一个0.2   0.2*3=0.6    强转为int后,保留整数部分就是0

生成一个0.5或者0.6  0.5*3=1.5或者0.6*3=1.8  强转后保留整数部分就是1

生成一个0.7   0.7*3=2.1   强转后  就是2

所以  int  num=(int)(Math.random*3)就是生成一个0到2的随机正整数。

3、题目本身就是要求生成随机数,所以那怕生成了5个0只要是随机生成的也是符合题目要求的

4、示例中是将for循环的遍历设置成数组的长度,是符合题目要求的,没有问题的

5、在switch结构中也是可以用break;来跳出循环的!break是java中的关键字跳出循环结束循环,可以用在for中也可以用在switch中。

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

  • 提问者 鱼儿0001 #1
    谢谢老师的耐心解答。我对Math.random()的理解是:它的区间是[0.0,1.0),然后强转为int类型的数字,因为是从double类数值转为int ,必须使用强转,老师,我上述的理解对吗?还有,我记得random还有一种写法,是什么Random random=new Random(3)+1;,好像是这样,有点忘了,老师能不能讲讲,谢谢你!老师,break语句用在if结构里,是跳出if结构,还是别的?
    2019-05-16 19:26:47
好帮手慕小班 2019-05-14 18:22:37

同学你好,前两个小问,书写没有问题,测试类的思路可以参考如下:

         Animal[] animal=new Animal[5];                 
        for(int i=0;i<animal.length;i++){
        //产生随机数,随机产生三种具体子类的实例
        int num=(int)(Math.random()*3);   
        //循环输出,循环体中每个对象分别调用cry()方法     
        switch(num){    //判断对应的数字
            case 0:
                animal[i]=new Cat();
                animal[i].cry();
                break;
            case 1:
                animal[i]=new Dog();
                animal[i].cry();
                break;
            case 2:
                animal[i]=new Sheep();
                animal[i].cry();
                break;
            }         
        }

每创建一次调用对应的cry方法,然后跳出当前循环!

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


  • 提问者 鱼儿0001 #1
    老师,1、这段代码:int num=(int)(Math.random()*3);。。。。怎么理解?我看不懂。 2、编程要求的是随机生成0到2的数字,根据数字将具体动物传入数组,但要是每次生成的都是同一个数字,如都是0岂不完了,你将for循环设置成只能传五次数值是不是不太合适?给数组传入具体动物,难道传入5次传满了就行了?3、在switch结构中,break是跳出switch循环吗?我记得用在for循环里,是跳出一层for循环。
    2019-05-16 17:07:51
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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