为什么要使用接口,多重继承与接口,接口的好处?

我对这件事仍然有些困惑。到目前为止,我发现的是

(这里已经提出了类似的问题,但我还有其他一些观点。

  1. 接口是仅抽象方法和最终字段的集合。

  2. Java 中没有多重继承。

  3. 接口可用于在 Java 中实现多重继承。

  4. 继承的一个优点是,我们可以在派生类中使用基类的代码,而无需再次编写它。也许这是遗产最重要的事情。

现在。。

问题 1.由于接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现任何接口,那么它就是继承呢?我们没有使用它的代码。

问题 2.如果实现接口不是继承,那么如何使用接口来实现多重继承?

问题 3.无论如何,使用接口有什么好处?他们没有任何代码。我们需要在实现它的所有类中一次又一次地编写代码。

那么为什么要做接口呢?

注意:我发现了一个界面有用的案例。它的一个例子就像在Runnable接口中,我们有公共的void run()方法,其中我们定义了线程的功能,并且有内置的编码,此方法将作为单独的线程运行。所以我们只需要编写在线程中要做什么的代码,Rest是预定义的。但是这个东西也可以使用抽象类和所有来实现。

那么使用接口的确切好处是什么呢?我们真的是使用接口实现的多重继承吗?


答案 1

问题 1.由于接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现任何接口,那么它就是继承呢?我们没有使用它的代码。

我们不能。接口不用于实现多重继承。他们用更安全,但功能稍弱的结构取而代之。请注意关键字,而不是 。implementsextends

问题 2.如果实现接口不是继承,那么如何使用接口来实现多重继承?

事实并非如此。对于接口,单个类可以具有多个“视图”,不同的API或功能。例如,一个类可以同时存在,而这两种方法实际上都在做同样的事情。RunnableCallable

问题 3.无论如何,使用接口有什么好处?他们没有任何代码。我们需要在实现它的所有类中一次又一次地编写代码。

接口是一种多重继承,没有后者引入的问题(如钻石问题)。

接口的用例很少:

  1. 对象实际上有两个标识:a 既是 a 又 .您可以使用前者或后者的预期实例(多态性)。这在现实生活中很少见,实际上是一个有效的例子,其中多重继承会更好(或特征)。TankVehicleWeaponTank

  2. 简单的职责:游戏中对象的实例还允许您在线程中执行它并响应鼠标事件。TankRunnableActionListener

  3. 回调接口:如果对象实现给定的回调接口,则会通知它其生命周期或其他事件。

  4. 标记接口:无需添加任何方法,但可通过发现对象功能或愿望轻松访问。 并且是这方面的例子。instanceofSerializableCloneable

你正在寻找的是特质(就像在Scala中一样),不幸的是,在Java中不可用。


答案 2

接口是最终静态字段和抽象方法的集合(新 Java 8 增加了对接口中具有静态方法的支持)。

在我们知道必须完成某些任务的情况下,会创建接口,但是应该如何完成它可能会有所不同。换句话说,我们可以说我们实现了接口,以便我们的类开始以特定的方式运行。

让我用一个例子来解释,我们都知道动物是什么。就像狮子是动物,猴子是动物,大象是动物,牛是动物等等。现在我们知道所有的动物都会吃东西并睡觉。但每种动物吃东西或睡觉的方式可能不同。就像狮子通过狩猎其他动物来吃东西一样,牛吃草。但两人都吃。所以我们可以有一些这样的伪代码,

interface Animal {
    public void eat();
    public void sleep();   
}

class Lion implements Animal {
    public void eat() {
        // Lion's way to eat
    }

    public void sleep(){
         // Lion's way to sleep
    }
}

class Monkey implements Animal {
    public void eat() {
        // Monkey's way to eat
    }

    public void sleep() {
        // Monkey's way to sleep
    }
}

根据上面提到的伪代码,任何能够进食或睡觉的东西都会被称为动物,或者我们可以说所有动物都必须吃和睡觉,但进食和睡觉的方式取决于动物。

对于接口,我们只继承行为,而不是像类继承那样的实际代码。

问题 1.由于接口只有抽象方法(没有代码),所以我们怎么能说如果我们实现任何接口,那么它就是继承呢?我们没有使用它的代码。

实现接口是另一种继承。它与类的继承不同,因为继承子类从基类获取要重用的实际代码。

问题 2.如果实现接口不是继承,那么如何使用接口来实现多重继承?

之所以这么说,是因为一个类可以实现多个接口。但我们需要明白,这种继承与类的继承不同。

问题 3.无论如何,使用接口有什么好处?他们没有任何代码。我们需要在实现它的所有类中一次又一次地编写代码。

实现接口会强制类重写其所有抽象方法。

在我的书中阅读更多 这里这里