【问题标题】:Why need interfaces in java? [duplicate]java为什么需要接口? [复制]
【发布时间】:2013-09-29 12:52:40
【问题描述】:

带有接口的代码

/* FileName : cat SampleInterface.java */
public interface SampleInterface
{
        public void draw();
        public void color();
}

带有抽象方法的代码

/* FileName : SampleAbstractMethod.java  */
abstract class SampleAbstractMethod
{
        public abstract void draw();
        public abstract void color();
}

它们在哪些方面不同?

肯定会有很大的不同,如果抽象方法足够,Java 开发人员就不会引入接口。我看到的共同点是

  1. 两者都不能有定义,就像我发布的代码一样。

  2. 继承或实现类必须引入定义。

现在我看到了抽象方法可以做接口可以做的事情,那为什么还要有接口呢?,接口有什么特别之处而抽象方法做不到呢?究竟是什么原因需要和接口?

EDIT:我的问题是关于抽象方法和接口之间的区别,而不是重复链接指向我的abstract classes。所以请解释一下我的问题与标记的重复项有何相似之处。

【问题讨论】:

  • 上面列出的前两个问题都已关闭,但我认为这重复了这个问题:Interface vs Abstract Class (general OO)
  • 与抽象类相比,接口的一个主要缺点是,如果你想更新接口,它会破坏你之前引用该接口的现有代码..
  • 抽象方法可能有实现,但接口方法只有方法签名

标签: java interface abstract


【解决方案1】:

抽象类仅在存在“是”关系时使用;接口可以通过类来实现,它们没有任何共同点。

抽象类可以实现方法;接口无法实现方法。

接口只能描述常量值和方法,而不能实现。接口的所有方法默认为public abstract,变量为public static final。

在Java中类可以继承(实现)很多接口,但只能继承一个抽象类。

有了抽象类,你就失去了继承它的类的个性。使用接口,您只需扩大每个类的功能。

界面的示例是“飞行”:蝴蝶、鸟或飞机。 抽象类的示例是“游戏”:足球、板球或国际象棋。

更新: 至于方法,你可以在接口和抽象类中都有抽象方法。你只需要选择在哪里使用它们。而这个问题让你明白接口和抽象类之间的区别。

【讨论】:

  • 我的问题是关于abstract methods 而不是abstract classes
  • @vikkyhacks 抽象方法的概念与抽象类的概念密切相关,你不能考虑一个没有另一个
  • 无论如何。在我的回答中,我承认接口方法默认为abstract。所以你可以在接口和抽象类中拥有抽象方法。所以现在你要选择where来使用它们。而这个问题让你明白接口和抽象类之间的区别。
  • 谢谢,+1 的回答,你能修改一下我的编辑,以便我可以接受它,
  • 好的,请查看更新后的答案。
【解决方案2】:

您的问题是关于抽象方法和接口之间的区别。但是我认为您忘记了接口中的所有方法都是抽象的一件事。所以接口和抽象中的方法是相同的。

嗯,接口的需要是为了满足多重继承的需要。 当您需要创建一个具体的类时使用抽象类,但希望确保所有子类中有一些共同的状态或某些操作可能有共同的实现。

【讨论】:

    【解决方案3】:

    抽象类可能有非抽象方法,而接口只能有方法声明。 在某些情况下,您需要一个具有某些功能的抽象类,但它的子类必须实现其抽象方法。 一个类可以实现多个接口,但可以从 1 个抽象类继承。

    【讨论】:

    • 确实,我想到了一个抽象类,介于接口和具体类之间
    【解决方案4】:

    一切都与可能性有关 ;-)

    在接口中,您只能进行函数声明。所以它在某种程度上是一个限制,你甚至不能定义变量(你可以定义常量)......

    在抽象类中你可以同时做这两个!您可以使用或不使用源代码的功能。你可以有变量等等...

    最重要的是,您只能使用一个抽象类作为父类,但可以使用任意多个父接口。

    所以这确实是一个问题,即您需要什么以及如何利用OOP 概念。

    如果你只是想减少代码,可以不假思索地使用它,但如果你想让一些东西更可靠,请阅读更多关于Subtyping

    【讨论】:

      【解决方案5】:

      查看 Oracle 的官方文档:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html(抽象类)和http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html(接口)。

      这里是 Stack Overflow 关于抽象类与接口的精彩讨论:Abstract class vs Interface in Java

      【讨论】:

      • 我的问题是关于abstract methods 而不是abstract classes
      • 这个答案真的是一个链接集合。链接非常适合支持答案,但不应该是完整的答案
      猜你喜欢
      • 2012-03-16
      • 2010-10-01
      • 1970-01-01
      • 2011-04-01
      • 2019-09-17
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多