3

在eclipse中执行以下java代码时,它给出了正确的输出(即打印'Class B'),但是根据java规范,无法编译代码(因为超类构造函数需要一个int参数并且构造函数由对 B 类的编译器包括对未定义的超类无 arg 构造函数的调用),当尝试在命令行中使用 javac 命令编译文件时,它只编译超类,即 A 类,并因以下编译而失败错误:

B.java:8: cannot find symbol
symbol  : constructor A()
location: class A
public class B extends A {
   ^
1 error

以下是java文件内容:

class A {

    public A(int x) {
        //
    }
}

public class B extends A {

    public static void main(String[] args) {
        System.out.println("Class b");
    }
}

有人可以解释 eclipse 如何在 bieng 无法编译类的情况下执行 main 方法。提前致谢。

更新

我删除了bin文件夹中eclipse创建的.class文件并尝试执行该类,但无法编译,因此没有运行。但是当我创建一个带有公共类名的源文件并保存时没有任何内容,然后添加上面的内容,它就起作用了。如果eclipse使用之前编译的版本来执行,怎么能给出方法的输出呢,因为在编译成功的时候main没有方法呢?main

4

3 回答 3

5

实际上,eclipse尝试编译该类并且由于构建错误而无法编译,当您简单地运行它执行先前编译的类的那些文件时,这些文件之前已成功编译(eclipse尝试在每次保存时编译和构建文件为每个通用设置)。

为了解决您可以在运行之前尝试清理项目,而对于 javac,它只是编译,

于 2012-05-11T06:52:57.203 回答
2

Eclipse 使用它自己的 Java 编译器(称为ecj)而不是javac. 该编译器允许(部分)编译损坏的源文件

于 2016-04-23T17:04:08.363 回答
1

Eclipse 不应该那样做。它导致模棱两可的结果。如果无法编译一个类,则应删除其对应的 .class 文件。

如果您检查 bin 文件夹,则存在 B.class 和 A.class。不知道为什么它会创建 B.class 即使 B 没有编译

于 2012-05-11T12:53:32.037 回答