缺少方法体,或声明抽象

Missing Method body, or declare abstract

我收到此错误消息:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: Pet.saySomething at PetTest.main(PetTest.java:18) Java Result: 1

这是我所拥有的:Speak class,

public class Speak {
   public void saySomething();
}

这是我在 PetTest class 中的内容:

 import java.util.ArrayList;

 public class PetTest {

     public static void main(String[] args)
     {
         ArrayList<Pet> myPets = new ArrayList<Pet>();

         myPets.add(new Parrot("Boss"));
         myPets.add(new Cat("Oreo"));
         myPets.add(new Dog("Riley"));

         for (Pet p: myPets)
         {
             p.saySomething();
             System.out.println(p);
         }
     }
 }

我没有 post 其他 5 class 与此程序一起使用。我知道 Speak class 中有些东西需要修复,但我被卡住了。在 Speak class 中,在表示 public void saySomething(); 的行中,它表示缺少方法主体,或声明抽象。

编辑:这是其他 classes:

 public abstract class Pet {

     String name;

     public Pet(String name){
         this.name = name;
     }
 }

 public class Parrot extends Bird {

     public Parrot (String name)
     {
         super(name);
     }

     @Override
     public void saySomething()
     {
         System.out.println("Pauly want a craker?");
     }

     @Override
     public String toString()
     {
         return "Hello, I'm " + name + " the parrot.";
     }

 }


 public class Dog extends Pet {

     public Dog (String name)
     {
         super(name);
     }

     @Override
     public void saySomething()
     {
         System.out.println("Ruff, ruff!");
     }

     @Override
     public String toString()
     {
         return "Hello, I'm " + name + " the dog.";
     }
 }


 public class Cat extends Pet {

     public Cat(String name)
     {
         super(name);
     }

     @Override
     public void saySomething()
     {
    System.out.println("Meow.");
     }

     @Override
     public String toString()
     {
         return "Hello, I'm " + name + " the cat.";
     }
 }

 public class Bird extends Pet {

     public Bird(String name)
     {
         super(name);
     }

     public void saySomething(){}

 }

如果 Speak 是一个具体的 class,它必须实现它的所有方法,所以 saySomething 必须有一个主体。

不过,看起来Speak更适合做接口。您的 Pet class 可以实现该接口。

您有以下说话选项,请随意选择:

第一

public abstract class Speak{

   public abstract void saySomething();

}

第二

public class Speak{

   public void saySomething(){

   }
}

第三

public interface Speak{

   public void saySomething();
}

编辑:首先,您没有在任何地方使用 Speak class。二、请在Petclass中添加如下方法:

 public abstract void saySomething();