当前位置: 首页 > 知识库问答 >
问题:

为什么继承的是类静态方法,而不是接口静态方法?

益绯辞
2023-03-14

我知道在Java中,静态方法和实例方法一样是继承的,不同的是,当它们被重新声明时,父实现是隐藏的,而不是重写的。好吧,这有道理。但是,Java教程指出

接口中的静态方法从不继承。

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?)
}

共有1个答案

李开宇
2023-03-14

这是我的猜测。

由于cat只能扩展一个类,如果cat扩展了animal,那么cat.idential只有一个含义。cat可以实现多个接口,每个接口都可以有一个静态实现。因此,编译器不知道该选哪一个?

然而,正如提交人所指出的,

如果让我再猜一遍,我会说对于default实现是cat的vtable的一部分。对于static则不能。主函数必须绑定到某些东西。在编译时,编译器可以将cat.identify替换为animal.identify,但如果重新编译了cat而不是包含main的类,则代码将不符合实际情况。

 类似资料:
  • 问题内容: 我正在阅读Khalid Mughal 撰写的Java™SCJP认证程序员指南。 在“继承”一章中,它说明了 成员的继承与声明的可访问性紧密相关。如果超类成员可以通过子类中的简单名称来访问(不使用任何其他语法,如super),则该成员被视为继承的 它还提到静态方法不是继承的。但是下面的代码完全可以: 我如何直接在课堂上使用?甚至更多,也可以。 这本书的解释仅适用于实例方法吗? 问题答案:

  • 问题内容: 为什么我的内部类中没有接口?为什么是天生的?抱歉,如果这是一个愚蠢的问题,我已经尽力一遍又一遍地用Google搜索,但似乎无法将其包裹在脑海中。如为什么不能在内部类/局部类中声明这些? 同样作为一个确认,我们在接口中可以包含静态最终变量的原因是因为它们未指定状态或任何此类实现权?如果我们输了而只使用了final,那么我们需要一个没有意义的实例,因为您无法实例化接口。抱歉,我真的很困惑,

  • 不允许在接口中使用静态/最终方法的原因到底是什么?

  • 伙计们,我有一个简单但令人讨厌的问题。据我所知,基本上意味着,对于该类的每个实例,这个方法将是相同的,如果我们改变它,这将改变该类的每个实例,它也被称为类方法。那么,如果我有一个类,它实现了某种格式的方法,让我们说: 为什么不能设置为静态?因为该类的每个实例的格式都是相同的。。。?

  • 问题内容: 对于有关辅助程序/实用程序类的这些简单问题,我从未找到好的答案: 为什么我要创建一个单例(无状态)而不使用静态方法? 如果对象没有状态,为什么需要一个对象实例? 问题答案: 通常,单例用于向应用程序引入某种 全局状态 。(说实话,通常不是很必要,但这是另一个话题。) 但是,在一些极端情况下,甚至 无状态 单例也可能有用: 您希望在可预见的将来用状态扩展它。 由于某些特定的 技术 原因,

  • 我能够运行以下代码: 现在我可以从类B的实例访问display()方法,那么为什么说静态方法不能继承呢。如果我在类B中声明一个方法display,那么可以说超类中的方法被隐藏,子类中的方法被调用,那么这不是重写方法时所需要的行为。