如果我们有抽象类,为啥要在 Java 中使用接口? [复制]
Posted
技术标签:
【中文标题】如果我们有抽象类,为啥要在 Java 中使用接口? [复制]【英文标题】:Why Interfaces in Java if we have abstract class? [duplicate]如果我们有抽象类,为什么要在 Java 中使用接口? [复制] 【发布时间】:2013-06-23 04:45:58 【问题描述】:我有两个问题
即使抽象类可以做接口的功能,为什么Java中还需要接口? 在搜索时,我发现了一个抽象类无法完成接口功能的地方, 这就是一个类需要实现多个接口的时候。 这是在java中提出接口概念的唯一原因吗?
接口中的静态最终变量有什么用? 欢迎需要说明接口中变量使用情况的示例程序。
提前致谢。
【问题讨论】:
如果你有两个问题,问两个问题。或者,更好的是,谷歌这两个问题。他们有 99% 的机会都会在搜索结果的第一页找到答案。 【参考方案1】:就像你说的,你只能继承一个抽象类,但可以继承很多接口。此外,继承意味着“is-a”关系,但接口指定了对象必须支持的一些操作集——本质上是它的行为。我将这些视为不同的想法。根据我的经验,类往往是名词(例如Integer
、List
),接口是动词(例如Cloneable
、Serializable
)。
如果一个类实现了一个带有常量的接口,那么该类可以在没有限定类名(javapractices.com) 的情况下引用这些常量。然而,正如this post 解释的那样,这是一种不好的做法。
【讨论】:
我的问题是。这是唯一的原因吗? 静态最终变量呢?【参考方案2】:接口在这些情况下很有用:
1-> 正如你所提到的,在 Java 中,我们只能扩展一个类,但可以实现多个接口。例如,如果你想在你的类中创建一个后台线程并扩展一些类以实现可重用性,这确实是实现的,那么你扩展线程类的情况如何?在这种情况下,Runnable 来救援它是一个接口。
2->还接口帮助我们强制执行某种设计模式。
3->也可用作可标记接口,就像可序列化接口一样
接口中的变量是充当全局变量的静态变量,可以与实现该接口的所有类共享
【讨论】:
【参考方案3】:为什么我们在java中需要接口,即使抽象类可以做到 接口的功能?在搜索中,我找到了一个地方 抽象类无法完成接口的功能,即 当一个类需要实现多个接口时。难道是唯一的 在 java 中提出接口概念的原因是什么?
Java 不支持多类继承。所以你可以实现多个接口。更重要的是,您可以同时实现接口和扩展其他类。如果您使用抽象类代替接口,这是不可能的。
接口中的变量有什么用?需要示例程序 欢迎在接口中使用变量的状态。
您在接口中声明的任何“字段”都是公共静态最终字段。换句话说,一个常数。因此,如果您想在所有子类中使用任何常量,则可以在接口中定义它们
【讨论】:
k 常量有什么用 常量可能有很多重要的用途。假设你想在你的所有子类中使用一个 PI 值。你可以在接口中声明它【参考方案4】:1.
这是在java中提出接口概念的唯一原因吗?
是的。另见Interface vs Abstract Class (general OO):
接口可能是多重继承的,抽象类可能不是(这可能是接口与抽象类分开存在的关键具体原因 - 它们允许实现多重继承,从而消除了一般 MI 的许多问题)。
2.
接口中的变量有什么用?欢迎需要说明接口中变量使用情况的示例程序。
你的意思是静态变量?我永远不会在接口中使用“有状态的”静态变量,但是 静态常量 非常好 - 这样您就可以添加与接口定义方式相关的附加信息。
【讨论】:
此类静态常量变量用法的任何示例,其中添加了与接口定义方式相关的附加信息【参考方案5】:1st)简单地说:你的类可以实现几乎无限数量的接口,但只能扩展一个(抽象)类。 抽象类可能包含代码——通常是子类之间共享的基本实现。
看看ArrayList
类:
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
如果没有接口,这将是不可能的......
2nd) 接口中没有变量。默认为public final
。
3rd) 使用接口,例如,您可以使用接口作为元素类型创建集合,并用完全不同类型的对象填充它,这些对象没有共同的基类(省略Object
)。
如果没有接口,您只能拥有Object
s 的集合,并检查每个对象的类型和强制转换。
使用接口,您可以将它们视为该接口的实现,并在它们上调用接口的方法,甚至不知道它们的具体类型。
【讨论】:
很抱歉再次询问。这是唯一的原因吗?以上是关于如果我们有抽象类,为啥要在 Java 中使用接口? [复制]的主要内容,如果未能解决你的问题,请参考以下文章