动物发声模拟器(多态)

设计一个动物发生模拟器,用于模拟不同动物的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。
定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout();
然后基于抽象类Animal定义狗类Dog、猫类Cat和山羊Goat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗,山羊),用shout()方法分别输出不同的叫声(比如喵喵、汪汪、咩咩)。
最后编写AnimalShoutTest类测试,输出:
猫的叫声:喵喵
狗的叫声:汪汪
山羊的叫声:咩咩

其中,在AnimalShoutTestMain类中,用speak(Animal animal){}方法输出动物animal的叫声,在main()方法中调用speak()方法,分别输出猫、狗和山羊对象的叫声。

请在下面的【】处添加代码。


```java
//动物发生模拟器.  请在下面的【】处添加代码。
public class AnimalShoutTest2 {
    public static void main(String[] args) {        
         Cat cat = new Cat();
         Dog dog = new Dog();        
        Goat goat = new Goat();
         speak(cat);
         speak(dog);
         speak(goat);
    }
    //定义静态方法speak()
    【】

}

//定义抽象类Animal
【】class Animal{
    【】
}
//基于Animal类,定义猫类Cat,并重写两个抽象方法
class Cat 【】{
    【】    
    【】
}
//基于Animal类,定义狗类Dog,并重写两个抽象方法
class Dog 【】{
    【】
    【】
}
//基于Animal类,定义山羊类Goat,并重写两个抽象方法
class Goat 【】{
    【】
    【】
}

img


以下是我的代码:




```java

public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Cat cat = new Cat();

        Dog dog = new Dog();        

       Goat goat = new Goat();

        speak(cat);

        speak(dog);

        speak(goat);

   }

   //定义静态方法speak()

   public static void speak(Animal animal){
       System.out.println(animal.getAnimalClass()+"的叫声:"+animal.shout());

}

//定义抽象类Animal

abstract class Animal{

   public abstract String getAnimalClass();
   public abstract String shout();

}

//基于Animal类,定义猫类Cat,并重写两个抽象方法

class Cat extends Animal{

   public String getAnimalClass(){
       return "猫";
   }
   public String shout(){
       return "喵喵";
   }
  
}

//基于Animal类,定义狗类Dog,并重写两个抽象方法

class Dog extends Animal{

   public String getAnimalClass(){
       return "狗";
   }
   public String shout(){
       return "汪汪";
   }

}

//基于Animal类,定义山羊类Goat,并重写两个抽象方法

class Goat extends Animal{

   public String getAnimalClass(){
       return "山羊";
   }
   public String shout(){
       return "咩咩";
   }
}
    }

img


这一行为什么出现这样的错误,应该怎么修改?

因为你使用了内部类,在外部使用时,就需要先new外部类再new内部类,这种用法其实是不推荐的。如果一定要这样用,可以如下:

public class TestAnimal {


    //定义静态方法speak()

    public static void speak(Animal animal){
        System.out.println(animal.getAnimalClass()+"的叫声:"+animal.shout());

    }

//定义抽象类Animal

    abstract class Animal{

        public abstract String getAnimalClass();
        public abstract String shout();

    }

//基于Animal类,定义猫类Cat,并重写两个抽象方法

    class Cat extends Animal{

        public String getAnimalClass(){
            return "猫";
        }
        public String shout(){
            return "喵喵";
        }

    }

//基于Animal类,定义狗类Dog,并重写两个抽象方法

    class Dog extends Animal{

        public String getAnimalClass(){
            return "狗";
        }
        public String shout(){
            return "汪汪";
        }

    }

//基于Animal类,定义山羊类Goat,并重写两个抽象方法

    class Goat extends Animal{

        public String getAnimalClass(){
            return "山羊";
        }
        public String shout(){
            return "咩咩";
        }
    }

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Cat cat = new TestAnimal().new Cat();

        Dog dog = new TestAnimal().new Dog();

        Goat goat = new TestAnimal().new Goat();

        speak(cat);

        speak(dog);

        speak(goat);

    }

}


class Cat extends Animal{

public Cat() {} // 加上一个构造函数