编译器错误,但程序执行正常

Pan*_*kaj 1 java

我对下面的代码感到困惑,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)

看下图中的输出,有人可以澄清一下吗?

为什么程序运行即使编译器错误?

Jon*_*eet 5

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.)