关于Java:使用接口的优点是什么?

What is the advantage of using interfaces

本问题已经有最佳答案,请猛点这里访问。

假设你有一个接口

1
2
3
4
5
6
7
public interface Change {

    void updateUser();
    void deleteUser();
    void helpUser();

}

我已经了解到接口是Java实现多重继承的方法。您实现了一个接口,然后就可以访问它的方法。我不明白的是,这些方法在接口中没有任何主体,所以您需要在您的类中给它们一个主体。因此,如果一个接口由多个类实现,则需要在多个类中为该方法提供一个主体。为什么这比在类中使用单独的方法,而不实现接口更好呢?


我大学的教授曾经讲过一个伟大的轶事来描述多态性和封装。就像这样。

这里有人知道汽水机的工作原理吗?(困惑地瞥了一眼我们为什么要谈论这个。)不?让我告诉你。

你的零钱掉进去了,机器里有一只小猴,它数着你所有的零钱,以确保你投入了足够的钱。当你按下苏打水的按钮时,会有一个小灯亮起,告诉猴子你按下了哪个按钮,如果你输入了正确的零钱量,它就会抓住你的选择,把它扔到小洞里,让你去拿苏打水。

这就是封装的概念。我们隐藏了苏打机的实现。除非它有一个漂亮的,透明的窗户让你看到里面,你真的不知道它是如何工作的。你所知道的就是你投入了一些现金,按下一个按钮,如果你投入足够的钱,你就会得到你的饮料。

另外,你知道如何使用苏打机的接口,因此只要机器的接口遵循通常的苏打机接口,你就可以使用它。这被称为接口契约。这台机器可以用传送带把南极洲的饮料送到你所关心的地方,只要你拿到饮料,天气冷,你就可以拿回零钱。

多态性的概念是,当您使用Soda机器接口时,它可能会做不同的事情。这就是封装和多态性密切相关的原因。在多态性中,您所知道的就是您正在使用一个SodaMachine实现,它可以被更改,因此,在幕后可以做不同的事情。这导致了多态性的驱动概念,即一个对象(SodaMachine的能力)根据接口后面的实际机器,实际充当MonkeySodaMachineConveyorSodaMachine两个对象。

可能不是逐字逐句,但足够接近。从本质上讲,它归结为两个概念:多态性和封装。如果你想澄清,请告诉我。


它将调用者期望的与实现分开。您拥有一组纯粹的方法,可以在不了解实现的情况下调用这些方法。实际上,一些库(如JMS和JDBC)提供的接口没有任何实现。

这种分离意味着您不需要知道任何实际实现的类。


Why is this better than just having individual methods in your classes, and not implementing an interface?

因为如果类C实现了接口I,那么每当需要I时,都可以使用C。如果不实现接口,则无法执行此操作(即使提供了接口所授权的所有适当方法):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface I {
    void foo();
}

class C1 implements I {
    public void foo() {
        System.out.println("C1");
    }
}

class C2 {  // C2 has a 'foo' method, but does not implement I
    public void foo() {
        System.out.println("C2");
    }
}

...

class Test {
    public static void main(String[] args) {
        I eye1 = new C1();  // works
        I eye2 = new C2();  // error!
    }
}


接口允许您保证某些方法存在并返回所需的类型。当编译器知道这一点时,它可以使用这个假设来处理未知类,就好像它们有某种已知的行为一样。例如,可比较的接口保证实现类能够比较某些类似的对象并返回一个int。

这意味着您可以比较实现此接口的任何内容,因此您可以对任何可比较的内容进行排序,而不是编写一个方法来排序字符串,另一个方法来排序整数,另一个方法来排序LabelledBoxesBooks


接口本质上保证继承它的所有方法都有自己的方法,这样您就可以安全地在接口中为继承它的任何东西调用方法。


它使使用接口定义API变得更容易,这样接口的所有具体实现都可以在每个类中提供预期的方法。

它还提供了一种实现多重继承的方法,这是不可能的(在爪哇)具有直的类继承。