为什么在实现接口的 class 中接口方法不能是静态的?
Why interface methods can't be static in class that implements the interface?
假设我有这样的代码:
public interface JustAnInterface {
void doSomething();
}
public class JustAnInterfaceImplementation implements JustAnInterface {
@Override
public static void doSomething() {
}
}
为什么 static doSomething()
方法显示错误“方法未覆盖其超类 中的方法”?
有人会说:因为@Override 和 static 根本不在一起。
请记住:多态性仅适用于非静态方法。 static表示你的方法是"attached"到包含class。
换句话说:您了解有关编译时 static 方法调用的所有信息。但是确定要调用哪个 overridden 方法的过程发生在运行时。这两个概念在 Java.
中不一致
GhostCat说的都对,但是@Override
注解不是编译错误的直接原因。
即使删除它,该方法在编译时也无效。
您不能通过在派生的 class 中添加 static
修饰符来覆盖或实现方法,因为 overriding/implementing 仅对实例方法有效。
尝试不带注释:
public class JustAnInterfaceImplementation implements JustAnInterface {
public static void doSomething() {
}
}
你会遇到一个比 @Override
更具体的编译错误
method does not override or implement a method from a supertype
你应该得到类似的东西:
overriding method is static
静态和非静态方法具有不同的签名,这不仅仅是因为 static
。
非静态方法偷偷带了一个额外的参数——this
的值。
如果您熟悉 python,您可以明确地看到:
class SomeClass(object):
def doSomething(self):
pass // whatever method body
这里的self
参数只是一个常规参数:你可以调用方法,自己传递这个参数。
在Java中,情况也差不多。当你调用 doSomething
方法时,你隐式地向它传递了一个参数,它变成了 this
.
但是,静态方法采用零 个参数。所以实际上,它们不是覆盖等效的,因此您没有正确覆盖方法。
JVM 必须以某种方式确定应该丢弃该参数。语言本可以被编写为允许这样做,但设计者采取了更简单的方法来禁止它(因为无论如何都没有充分的理由使用它)。
假设我有这样的代码:
public interface JustAnInterface {
void doSomething();
}
public class JustAnInterfaceImplementation implements JustAnInterface {
@Override
public static void doSomething() {
}
}
为什么 static doSomething()
方法显示错误“方法未覆盖其超类 中的方法”?
有人会说:因为@Override 和 static 根本不在一起。
请记住:多态性仅适用于非静态方法。 static表示你的方法是"attached"到包含class。
换句话说:您了解有关编译时 static 方法调用的所有信息。但是确定要调用哪个 overridden 方法的过程发生在运行时。这两个概念在 Java.
中不一致GhostCat说的都对,但是@Override
注解不是编译错误的直接原因。
即使删除它,该方法在编译时也无效。
您不能通过在派生的 class 中添加 static
修饰符来覆盖或实现方法,因为 overriding/implementing 仅对实例方法有效。
尝试不带注释:
public class JustAnInterfaceImplementation implements JustAnInterface {
public static void doSomething() {
}
}
你会遇到一个比 @Override
method does not override or implement a method from a supertype
你应该得到类似的东西:
overriding method is static
静态和非静态方法具有不同的签名,这不仅仅是因为 static
。
非静态方法偷偷带了一个额外的参数——this
的值。
如果您熟悉 python,您可以明确地看到:
class SomeClass(object):
def doSomething(self):
pass // whatever method body
这里的self
参数只是一个常规参数:你可以调用方法,自己传递这个参数。
在Java中,情况也差不多。当你调用 doSomething
方法时,你隐式地向它传递了一个参数,它变成了 this
.
但是,静态方法采用零 个参数。所以实际上,它们不是覆盖等效的,因此您没有正确覆盖方法。
JVM 必须以某种方式确定应该丢弃该参数。语言本可以被编写为允许这样做,但设计者采取了更简单的方法来禁止它(因为无论如何都没有充分的理由使用它)。