Java中接口的重要性

Wan*_*ant 42 java interface

假设我们有两个类, Tiger并且Aeroplane.这两种类型的一个共同点是速度.我知道,这将是不合逻辑创建一个超类ClassWithSpeed,然后派生子类Aeroplane,并Tiger从它.相反,它是最好创建一个包含方法的接口speed(),然后实现它AeroplaneTiger.我明白了.但是,如果没有接口,我们可以做同样的事情.我们可以定义方法speed()Aeroplane和方法speed()Tiger.唯一(也许是非常大的)缺陷是我们无法"到达" 接口引用的对象TigerAeroplane通过接口引用.

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

may*_*Van 71

它的:

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

...
Run Code Online (Sandbox Code Playgroud)

VS

public int howFast(Mover mover) {
    return mover.speed();
}
Run Code Online (Sandbox Code Playgroud)

现在,想象一下howFast将来要回去改变所有这些功能.

接口还是不行,每个类都必须实现或继承该speed()方法.界面允许您更轻松地使用这些不同的类,因为它们每个都承诺以某种方式运行.你会打电话speed(),他们会返回一个int,所以你不必为每个可能的类编写单独的方法.

当您发现由于相对论物理学的突破而需要以不同的方式处理速度时,您只需要更新调用的方法speed().当你的曾孙女为一个班级写作时HyperIntelligentMonkeyFish,她不必拆解你的古代二进制文件并进行修改,以便你的代码可以监视和控制她的突变军队.她只需要宣布这一点HyperIntelligentMonkeyFish implements Mover.

  • +1 - "Mover"是一个比我的"IObjectWithSpeed"更好的名字,你的代码很好地说明了. (8认同)
  • 接口不提供实现,因此您仍然需要单独更改速度功能... (4认同)
  • 应该说你应该只在需要时添加接口并且它们是有意义的.不要为所有方法创建接口以防万一:p (2认同)

Yis*_*hai 8

接口允许Java,因为它是静态类型的,可以解决多种继承限制,达到语言设计者认为值得的程度.

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

另一方面,Java是静态类型的,这意味着编译器必须同意该方法将提前存在.在不共享共同祖先的类上执行此操作的唯一方法是,只能使用Object,这是一个接口.

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

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


sti*_*ike 6

我试图通过以下示例解释接口的优点 -

假设您有另一个类,您需要使用老虎或飞机作为参数.因此,通过使用接口,您可以使用

someObject.someMethod(ClassWithSpeed)
Run Code Online (Sandbox Code Playgroud)

但如果你不使用界面,你可以使用

someObject.someMethod(Tiger)
someObject.someMethod(AeroPlane)
Run Code Online (Sandbox Code Playgroud)

那你该怎么办?你可能的答案就像,"I will use two overloaded method".

到目前为止,这是可以的,但是

假设您需要添加更多选项(比如汽车,自行车,兔子,乌龟......等等).那么你将如何改变你现有的代码呢?你需要改变很多东西..

上面的整个例子只有一个目的.也就是说

"我们需要界面来创建更好,可重用且适当的面向对象的设计"

NB

  1. 如果您确定程序太小而且您永远不需要更改它们,那么我认为没有接口就可以实现

  • 如果使用接口,您仍然需要在每个类中进行更改,接口不提供实现... (3认同)

And*_*mas 5

定义接口允许您定义不仅适用于Airplane和Tiger的方法,还可以定义共享相同接口的其他类.

例如,假设您的接口是IObjectWithSpeed.然后你可以定义一个这样的方法 - 在一个操作IObjectWithSpeed对象的类中.

  public double calculateSecondsToTravel( IObjectWithSpeed obj, double distance ) {
       return distance / obj.getSpeed();
  }
Run Code Online (Sandbox Code Playgroud)

接口允许我们满足开放/封闭原则 - 打开扩展,但关闭修改.上面的方法的单个实现不需要修改,因为定义了实现IObjectWithSpeed的新类.

  • 是的,但我们可以在每个类中实现 speed()。我们不节省时间和空间,因为在界面中我们没有定义函数。 (2认同)