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