我对下面的代码感到困惑,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");
}
}
Run Code Online (Sandbox Code Playgroud)
看下图中的输出,有人可以澄清一下吗?
Eclipse允许您运行"大部分"代码,即使它们不能完全正确编译 - 尽管它通常会提示您.通常,不编译的代码会抛出异常以指示编译失败.
在这种情况下,您永远不会结束调用Subclass.foo,因此您没有看到编译错误异常.
如果您将第一行更改main为:
Subclass s = new Subclass();
Run Code Online (Sandbox Code Playgroud)
...然后它会尝试调用破碎的方法,你会得到这样的输出:
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)
Run Code Online (Sandbox Code Playgroud)
我个人强烈建议你在尝试运行时点击"取消",Eclipse会告诉你它有编译时错误.如果您之前点击了"始终无需启动",则需要进入您的首选项并在"启动"下更改"如果项目包含错误则继续启动",从"始终"到"提示".(该文本可能已更改;我使用的是相当旧版本的Eclipse.)