2016-05-18 81 views
0

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

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

+0

试着让你的类保持在不同的文件中。 – Berger

+0

@Berger它们在单独的Java文件中。查看截图:op编译'Animals.java',但在'Mammals.java'上失败。 – computerfreaker

+0

我已将源文件和类文件保存在不同的文件夹中,但它不会编译显示相同的错误。已使用eclipse,但我知道它不从cmdprompt编译的实际原因 – Kaushal

回答

2

的问题是,你一个一个编译文件,并编译Mammals时的javac找不到Animals。来自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 
+2

更好的是,使用IDE。 – Andreas

+0

但是,由于默认的类路径是“。” (当前目录),单纯的调用(甚至一个接一个)应该已经找到以前编译的编译过的类。 @ user2033516:也许你的环境中有一些CLASSPATH值? – rpy

+0

@Andreas同意。不幸的是,OP的屏幕截图暗示了一个compsci课程,根据我的经验,在Notepad中编写代码并通过命令行进行编译将作为标准练习教授。 – computerfreaker

相关问题