无法编译具有实现的接口的抽象类

时间:2016-05-18 08:01:29

标签: java inheritance interface abstract-class

这是我的第一个问题。我有两个类和一个接口。我无法编译以下代码。任何人都可以帮助我们解释为什么代码没有编译和运行。

public interface Animals {
    public void run();

    public void eat();

    public void excreate();

    public void mate();
}

public abstract class Mammals implements Animals {
    public void run() {
        System.out.println("Run with Four Legs");
    }

    public void eat() {
        System.out.println("Eat Grass");
    }

    public void excreate() {
        System.out.println("Excreate Excreata");

    }

    public void mate() {
        System.out.println("Mammals Mate with a Mammal");
    }

    public abstract void giveBirth();


}

public class Horse extends Mammals {
    public void mate() {
        System.out.println("Horse Mates With A Mare");
    }

    public void giveBirth() {
        System.out.println("Giving Birth To Foal");
    }

    public static void main(String[] args) {
        Horse h1 = new Horse();
        h1.eat();
        h1.run();
        h1.mate();
        h1.giveBirth();

    }
}

动物代码成功编译,而哺乳动物和马类没有编译。 错误附在下面的屏幕截图中 scrren1

1 个答案:

答案 0 :(得分:2)

问题是您正在逐个编译文件,而javac在编译Animals时找不到Mammals。来自javac docs

  

编译源文件时,编译器通常需要有关其定义未出现在命令行上给出的源文件中的类型的信息。

     

当编译器需要类型信息时,它会查找定义类型的源文件或类文件。编译器首先在引导程序和扩展类中搜索类文件,然后在用户类路径(默认情况下是当前目录)中搜索。通过设置CLASSPATH环境变量或使用-classpath命令行选项来定义用户类路径。 (有关详细信息,请参阅Setting the Class Path)。

     

如果设置-sourcepath选项,编译器将在指示的路径中搜索源文件;否则编译器会在用户类路径中搜索类文件和源文件。

正如您从屏幕截图中看到的那样,您正在编译的目录未被搜索源类文件。 javac实际上并未意识到Animals是什么。

您可以将源路径/类路径设置为包含源文件夹,也可以直接编译多个源文件as the javac docs show

  

编译多个源文件

     

此示例编译包问候语中的所有源文件。

C:\>dir /B
greetings
C:\>dir greetings /B
Aloha.java
GutenTag.java
Hello.java
Hi.java
C:\>javac greetings\*.java
C:\>dir greetings /B
Aloha.class                        
Aloha.java                           
GutenTag.class
GutenTag.java
Hello.class
Hello.java
Hi.class
Hi.java