Java中接口的重要性 [已关闭]

2022-09-01 01:20:09

假设我们有两个类,和 .这两种类型的一个共同点是速度。我知道创建一个超类然后从中推导出子类是不合逻辑的。相反,最好创建一个包含该方法的接口,然后在 and 中实现它。我明白了。但是,我们可以在没有接口的情况下做同样的事情。我们可以在 中定义方法,在 中定义方法。唯一(也许是非常大的)缺陷是我们无法通过接口引用“访问”对象。TigerAeroplaneClassWithSpeedAeroplaneTigerspeed()AeroplaneTigerspeed()Aeroplanespeed()TigerTigerAeroplane

我是Java和OOP的初学者,如果有人向我解释接口的作用,我将不胜感激。干杯!


答案 1

它:

public int howFast(Airplane airplane) {
    return airplane.speed();
}

public int howFast(Tiger tiger) {
    return tiger.speed();
}

public int howFast(Rocket rocket) {
    return rocket.speed();
}

public int howFast(ThingThatHasntBeenInventedYet thingx) {
    // wait... what? HOW IS THIS POSSIBLE?!
    return thingx.speed();
}

...

public int howFast(Mover mover) {
    return mover.speed();
}

现在,想象一下将来必须返回并更改所有这些功能。howFast

接口或否,每个类都必须实现或继承该方法。接口允许您更轻松地使用这些不同的类,因为它们都承诺以某种方式运行。您将调用 ,并且它们将返回 一个 ,因此您不必为每个可能的类编写单独的方法。speed()speed()int

当你发现由于相对论物理学的突破而需要以不同的方式处理速度时,你只需要更新调用.当你的曾孙女为 写一门课时,她不必反汇编你的古代二进制文件并进行更改,这样你的代码就可以监视和控制她的变异军队。她只需要声明.speed()HyperIntelligentMonkeyFishHyperIntelligentMonkeyFish implements Mover


答案 2

接口允许Java,因为它是静态类型的,可以解决语言设计人员认为值得的多重继承限制。

在动态语言(如Python,Ruby等)中,您可以在任何任意对象上调用speed方法,并在运行时发现它是否存在。

另一方面,Java是静态类型的,这意味着编译器必须同意该方法将提前存在。在没有共同祖先的类上执行此操作的唯一方法是接口,并且可能只有共同的对象。

由于对象可以实现任意数量的接口,这意味着您可以获得多重继承(单个对象可以作为不同方法的多个不同对象)的优点,而没有缺点(两个超类中冲突的实现)。

在Java 8中,该语言的设计者得出结论,没有任何实现的接口过于严格(我猜他们不喜欢我的解决方案;-)),因此他们允许默认实现,从而扩展了接口的多继承选项,同时仍然试图通过一组复杂的优先规则来避免冲突的实现问题,以便有一个明确的默认实现来执行。