Java 为什么可以';我是否创建了一个名为wait()的静态方法?

Java 为什么可以';我是否创建了一个名为wait()的静态方法?,java,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 当它是一个静态方法时,为什么它甚至试图覆盖对象

示例代码:

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

public final void wait()
final方法不能被子类/子类重写

在方法签名中,不考虑像
static
这样的修饰符

  • 方法名
  • 参数
  • 参数类型
  • 参数顺序

根据新规范,现在方法返回类型也是方法签名的一部分。

这是java.lang.Object.wait()方法的声明

正如它所说的,它是一个最终的方法,这意味着您不能重写它


不管您是否尝试将该方法声明为静态,因为您已经从类对象继承了wait()方法。您在这里尝试的是使用“static”关键字修改方法。

如果允许您编写一个静态方法
wait()
,其签名与非静态
对象相同。wait()
方法,应在以下代码中调用哪个方法:

A a = new A();
a.wait();
它是从
对象继承的实例的
wait()
方法还是从类A继承的静态
wait()
方法?因此,从编译器的角度来看,这是不可区分的,因此同一类的静态方法和非静态方法之间没有区别


这意味着非静态最终方法不能被具有相同签名的方法覆盖,无论该覆盖方法是否为静态。

可能重复的@Rao不是重复的,因为该方法是静态的。
A a = new A();
a.wait();