gpt4 book ai didi

java - 为什么继承类静态方法而不是接口(interface)静态方法?

转载 作者:IT老高 更新时间:2023-10-28 20:36:45 25 4
gpt4 key购买 nike

我知道在 Java 中静态方法像实例方法一样被继承,不同之处在于当它们被重新声明时,父实现被隐藏而不是被覆盖。好吧,这是有道理的。但是,the Java tutorial注意到

Static methods in interfaces are never inherited.

为什么?常规方法和接口(interface)静态方法有什么区别?

让我澄清一下我所说的静态方法可以被继承的意思:

class Animal {
public static void identify() {
System.out.println("This is an animal");
}
}
class Cat extends Animal {}

public static void main(String[] args) {
Animal.identify();
Cat.identify(); // This compiles, even though it is not redefined in Cat.
}

然而,

interface Animal {
public static void identify() {
System.out.println("This is an animal");
}
}
class Cat implements Animal {}

public static void main(String[] args) {
Animal.identify();
Cat.identify(); // This does not compile, because interface static methods do not inherit. (Why?)
}

最佳答案

这是我的猜测。

因为 Cat 只能扩展一个类,如果 Cat extends Animal 然后 Cat.identify 只有一种含义。 Cat 可以实现多个接口(interface),每个接口(interface)都可以有一个静态实现。因此,编译器不知道该选择哪一个?

然而,正如作者所指出的,

Java already has this problem, with default methods. If two interfaces declare default void identify(), which one is used? It's a compile error, and you have to implement an overriding method (which could just be Animal.super.identify()). So Java already resolves this problem for default methods – why not for static methods?

如果我再猜一次,我会说 default 的实现是 Cat 的 vtable 的一部分。 static 不能。主函数必须绑定(bind)到某些东西。在编译时,编译器可以将 Cat.identify 替换为 Animal.identify,但如果重新编译 Cat,代码将与现实不符,但是不是包含 main 的类。

关于java - 为什么继承类静态方法而不是接口(interface)静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25169175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com