示例代码:
class A {
static void wait(){}
}
似乎编译时不应该有问题,但它不会编译。请注意,该方法是静态的。
编译错误:
A.java:2: error: wait() in A cannot override wait() in Object
static void wait(){}
^
overriding method is static
1 error
为什么当它是静态方法时,它甚至试图覆盖wait()
中的Object
?
答案 0 :(得分:3)
如果允许编写与非静态wait()
方法具有相同签名的静态方法Object.wait()
,则应在以下代码中调用哪个方法:
A a = new A();
a.wait();
是继承自wait()
的实例的Object
方法还是来自Class A 的静态wait()
方法?因此,从编译器的角度来看,这是不可区分的,因此静态方法和同一类的非静态方法之间没有区别。
这意味着非静态最终方法不能被具有相同签名的方法覆盖,无论这种覆盖方法是否是静态的。
答案 1 :(得分:2)
以下是Object.wait()
的方法签名,btw Object
中有更多重载方法:
public final void wait()
最终方法无法被子/子类覆盖。
在方法签名中,不考虑static
之类的修饰符。
根据新规范,现在方法返回类型也是方法签名的一部分。
答案 2 :(得分:2)
这是java.lang.Object.wait()方法
的声明public final void wait().
正如它所述,这是一个最后的方法,这意味着你无法覆盖它。
您是否尝试将该方法声明为静态并不重要,因为您已经从Object类继承了wait()方法。你在这里尝试做的是使用'static'关键字修改方法。