当在eclipse中执行以下java代码时,它会给出正确的输出(即打印'Class B'),但根据java规范,代码无法编译(因为超类构造函数需要{{1}参数和编译器提供给B类的构造函数包括对超类no arg构造函数的调用(未定义),当尝试在命令行中使用javac命令编译文件时,它只编译超类即A类并因以下编译错误而失败:
int
以下是java文件内容:
B.java:8: cannot find symbol
symbol : constructor A()
location: class A
public class B extends A {
^
1 error
有人可以解释eclipse如何在没有bieng能够编译类的情况下执行main方法。提前谢谢。
更新
我在bin文件夹中删除了eclipse中的.class文件,并尝试执行该类,但无法编译,因此无法运行。但是当我创建一个具有公共类名称的源文件并且没有任何内容保存,然后添加上述内容时,它就起作用了。如果eclipse使用以前编译的版本来执行,它怎么能给出class A {
public A(int x) {
//
}
}
public class B extends A {
public static void main(String[] args) {
System.out.println("Class b");
}
}
方法的输出,因为它在成功完全编译时没有main
方法?
答案 0 :(得分:5)
实际上,eclipse尝试编译类并且由于构建错误而无法编译,当你只是运行那些执行先前编译的类的文件时,这些文件已经成功编译过了(eclipse尝试编译和构建文件)每个按照通用设置保存。)
为了解决你可以在运行之前尝试清理项目,而在javac的情况下,它只是编译,
答案 1 :(得分:1)
Eclipse不应该这样做。这会导致模棱两可的结果。如果无法编译类,则应删除其对应的.class文件。
如果检查bin文件夹,则存在B.class和A.class。不知道为什么它创建B.class,即使B不编译
答案 2 :(得分:1)
Eclipse使用自己的Java编译器(称为dtype
)而不是ecj
。这个编译器allows (partial) compilation of broken source files。