为什么我不能创建一个名为wait()的静态方法?

时间:2017-04-15 05:53:51

标签: java

示例代码:

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

3 个答案:

答案 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'关键字修改方法。