我对下面的代码感到困惑,Eclipse将编译器错误显示为"这种静态方法无法隐藏Super"但是在执行时它工作正常。
package com.journaldev.java;
public class Test {
public static void main(String[] args) {
Super s = new Subclass();
s.foo();
}
}
class Super {
void foo() {
System.out.println("Super");
}
}
class Subclass extends Super {
static void foo() {
System.out.println("Subclass");
}
}
请参阅下图中的输出,有人可以澄清一下吗?
答案 0 :(得分:5)
Eclipse允许您运行"大多数"你的代码,即使它不能正确编译 - 尽管它通常会提示你。通常,不编译的代码会抛出异常以指示编译失败。
在这种情况下,您永远不会最终调用Subclass.foo
,因此您不会看到编译错误异常。
如果您将main
的第一行更改为:
Subclass s = new Subclass();
...然后将尝试调用已损坏的方法,并且您将获得如下输出:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
This static method cannot hide the instance method from Super
at sandbox.Subclass.foo(Test.java:18)
at sandbox.Test.main(Test.java:7)
我个人强烈建议你点击"取消"当你尝试运行某些东西时,Eclipse告诉你它有一个编译时错误。如果您之前点击过"总是在没有询问的情况下启动"你需要进入你的偏好并在"启动"更改"如果项目包含错误,则继续启动"来自"始终"到"提示"。 (文本可能已经改变;我使用相当旧版本的Eclipse。)