【问题标题】:Not able to compile an abstract class having an interface implemented无法编译实现接口的抽象类
【发布时间】:2016-05-18 08:01:29
【问题描述】:

这是我的第一个问题。我有两个类和一个接口。我无法编译以下代码。谁能帮我们弄清楚为什么代码没有编译和运行。

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();

    }
}

Animal 和 Horse 类未编译时,Animal 代码编译成功。 错误附在下面的屏幕截图中 scrren1

【问题讨论】:

  • 尝试将您的课程保存在不同的文件中。
  • @Berger 它们位于不同的 Java 文件中。看截图:op 编译Animals.java,但在Mammals.java 上失败。
  • 我已经将源文件和类文件保存在不同的文件夹中,但它没有编译显示相同的错误。一直在使用 eclipse,但我不知道它没有从 cmdprompt 编译的实际原因
  • 问题是类路径得到了纠正,代码行现在工作正常。感谢您的支持

标签: java inheritance interface abstract-class


【解决方案1】:

问题是你一个一个地编译文件,编译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

【讨论】:

  • 更好的是,使用 IDE。
  • 但是因为默认的类路径是“.” (当前目录)仅仅调用(甚至一个接一个)应该已经从以前的编译中找到了编译的类。 @user2033516:也许您的环境中有一些 CLASSPATH 值?
  • @Andreas 同意。不幸的是,OP 的屏幕截图暗示了一个 compsci 课程,根据我在记事本中编写代码和通过命令行编译的经验,这是一种标准做法。
  • @rpy 当类路径设置为 ...\servlet-api.jar 时,默认类路径是否为 .(当前目录)无关紧要。查看屏幕截图,其中列出了“源文件的路径”和“类文件的路径”。似乎设置了CLASS_PATH 环境变量,并且它不包括当前目录。
  • 在 CLASSPATH 变量中添加 .;with 解决了代码编译和工作正常的问题!!!!之前在 eclipse 上工作过很多应用程序,但这次我选择使用 notepad++,在这里你不会得到任何你知道的错误。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 2012-07-17
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多