【问题标题】:Exact use of abstract class and Interface in java [closed]java中抽象类和接口的确切使用[关闭]
【发布时间】:2014-06-27 06:23:25
【问题描述】:

我已经阅读了很多抽象类和接口的例子,但我没有得到这样做的用途,因为两者都在做同样的工作。谁能给我一个简单的例子来弄清楚这个谜题

【问题讨论】:

  • 他们做同样的工作。 肯定是一种用途,否则它们可能不会出现在该语言中。请参阅this 问题了解为什么接口有用,并参阅this 了解抽象类有用的一些原因。如果你认为他们在做同样的工作,你还不了解他们。我会把它当作一个骗子来结束,但没有一个问题包含这个问题的答案......

标签: java interface abstract-class


【解决方案1】:

首先,修改BASIC DIFFERENCES:-

  1. Java 接口中声明的变量默认为 final。抽象类可能包含非最终变量。

  2. Java 接口的成员默认是公共的。 Java 抽象类可以具有通常的类成员风格,例如私有、受保护等。

  3. Java 接口应该使用关键字“implements”来实现;应使用关键字“extends”扩展 Java 抽象类。

  4. 一个接口只能扩展另一个Java接口,一个抽象类可以扩展另一个Java类并实现多个Java接口。

  5. 一个 Java 类可以实现多个接口,但它只能扩展一个抽象类。 接口是绝对抽象的,不能实例化; Java 抽象类也不能被实例化,但可以在 main() 存在时调用。

  6. 与 java 抽象类相比,java 接口很慢,因为它需要额外的间接。

如果这些陈述中的任何一个适用于 你的情况:

您希望在几个密切相关的类之间共享代码。 您希望扩展抽象类的类具有许多公共方法或字段,或者需要公共以外的访问修饰符(例如受保护和私有)。

您要声明非静态或非最终字段。这使您能够定义可以访问和修改它们所属对象的状态的方法。

如果这些陈述中的任何一个适用于您的 情况:

您希望不相关的类会实现您的接口。例如,接口 Comparable 和 Cloneable 由许多不相关的类实现。

您想指定特定数据类型的行为,但不关心谁实现了它的行为。

您想利用类型的多重继承。

(取自 Oracle 官方教程)。

【讨论】:

  • 从 Java 8 开始,第一点不再正确。此外,根据this 问题,最后一点不再正确。
  • 好的,谢谢。我会按照您的说法对其进行编辑。实际上,我不确定,因为我还没有阅读过 Lambda 函数和默认方法等!谢谢。
  • 对不起,应该更具体。 Java 接口默认没有实现,但从 Java 8 开始,您可以使用 default 关键字实现方法。另外,看看我链接的问题。似乎第 6 点不再正确。
  • @user3580294-哦,对不起,我把它贴错了答案。真的,这不是我的本意!
【解决方案2】:

关于何时使用接口和抽象类的一个简单答案是: 当您知道不必修改接口时使用接口,即添加/删除/修改方法,因为如果您更改接口的实现,则必须在该特定接口所在的所有类中执行相同操作实施。

另一方面,如果您知道随着时间的推移可能会添加/删除/修改方法,则应该使用抽象类。因此,如果您必须添加一个方法,您可以将其添加到抽象类中,而无需将其声明为抽象方法。

我在某处读到过这篇文章,但现在找不到参考资料...

希望这会有所帮助..

【讨论】:

    【解决方案3】:

    有一次我偶然发现了一篇非常好的文章,它描述了:

    功能

    多重继承

    区别

    一个类可以继承多个接口。

    一个类只能继承一个抽象类。

    功能

    默认实现

    区别

    接口不能提供任何代码,只能提供签名。

    抽象类可以提供完整的默认代码和/或仅提供必须覆盖的细节。

    功能

    访问修饰符

    区别

    接口不能有子、函数、属性等的访问修饰符,一切都被假定为公共
    抽象类可以包含子类、函数、属性的访问修饰符

    功能

    核心 VS 外设

    区别

    接口用于定义类的外围能力。换句话说,Human 和 Vehicle 都可以从 IMovable 接口继承。

    抽象类定义了一个类的核心标识,并用于相同类型的对象。

    功能

    同质性

    区别

    如果各种实现只共享方法签名,那么最好使用接口。

    如果各种实现是同类并使用共同的行为或状态,那么最好使用抽象类。

    功能

    速度

    区别

    接口需要更多时间才能在对应的类中找到实际的方法。

    虽然抽象类做得很快

    功能

    添加功能(版本控制)

    区别

    如果我们向接口添加新方法,那么我们必须跟踪接口的所有实现并为新方法定义实现。

    如果我们向抽象类添加新方法,那么我们可以选择提供默认实现,因此所有现有代码都可以正常工作。

    功能

    字段和常量

    区别

    接口中不能定义字段
    抽象类可以定义字段和常量

    您可以refer this了解更多信息

    【讨论】:

    • 正如我在 Shekar 的帖子中评论的那样,接口可以从 Java 8 开始实现,而且两者之间似乎不再存在速度差异。此外,您可以在接口中定义字段。
    猜你喜欢
    • 2015-06-27
    • 2012-03-25
    • 2023-04-03
    • 2017-11-15
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多