纯抽象类和接口

时间:2010-01-19 07:47:04

标签: java

有谁能告诉我完全抽象的类和接口之间究竟有什么区别?

Abstract类也可以将其所有方法都抽象化。接口的所有方法都是抽象的。在这种情况下,两者之间的主要区别是什么?

如果纯抽象类和接口之间存在差异?界面有什么用?在使用接口的地方,我们可以使用纯抽象类?

11 个答案:

答案 0 :(得分:15)

完成以前的答案:

界面是“合同”。如果类实现了接口,则必须提出接口中列出的所有服务。

抽象类是骨架。它定义了扩展类的某种方式,同时让它们有一些自由空间(抽象方法)是唯一的。

一个纯粹的抽象类与接口做同样的事情但是有独特的扩展问题所以,对我来说,它没有兴趣

答案 1 :(得分:10)

每个接口都是隐式抽象的:接口体中的每个方法声明都是隐式抽象和公共的。

抽象类具有可以包含实现的方法。抽象方法可以是公共的,受保护的或默认访问(包可见)。与接口不同,抽象类可以包含非静态和最终的字段。

另见:
Interfaces vs Abstract classes和。{ Java tutorial

答案 2 :(得分:5)

在Java和C#中,可以使用多个接口派生而且只能从一个类继承,

答案 3 :(得分:3)

  

这不是一个非常有说服力的解释,但是,以编程方式来说,这一切都是正确的

                                    Interface                   Abstract Class
Extend Class                            No                          Yes
Extend Abstract Class                   No                          Yes
Implement Interface                     Yes(Extend Interface)       Yes
Variables                               Public Static Final         Public/Protected/Private/static/final/transient/volatile
Contain Non-Public Method               No                          Public/Protected/*Private
Contain Abstract Method                 Yes                         Yes
Contain No-Body, Non-Abstract Method    Yes                         No
Contain Defined Method                  No                          Yes
Contain Main Method                     No                          Yes

*抽象类可以有私有方法,但不能使用抽象私有方法。

答案 4 :(得分:3)

选择纯抽象而不是接口的一个原因是强制子类实现由超类实现的特定方法。

例如(在Java中),

假设您希望所有扩展类实现toString(),equals()和hashCode()。

您可以为该合约创建一个名为ForceSomeMethods的接口,但这些方法是由Object隐式实现的。

使用toString()等将ForceSomeMethods作为纯抽象类作为抽象方法,所有子类都将被强制实现这些方法。

答案 5 :(得分:2)

抽象类可以提供实现,即(公共,受保护,私有)方法主体。接口只能声明公共方法签名。必须通过实现接口的类来实现这些方法(以方法体的形式)。

答案 6 :(得分:2)

有三点不同:

  1. 接口只能声明公共方法(即没有受保护或包私有的可见方法)并且不能声明任何字段
  2. 子类最多只能扩展一个抽象类,但可以实现任意数量的接口
  3. 抽象类 也可以实现部分或全部方法

答案 7 :(得分:2)

由于问题是关于抽象类,所以我会说答案将与继承和范围相关。这是我多次想到的事情,这就是我想出来的。

显然,之前已经回答了与多重继承相关的功能,所以我不会介绍其中的任何内容。但范围很大。

界面中,您无法定义成员的访问修饰符,因为它们是隐式公开的,...您正在为其最终实现定义公共接口。由于可以在纯抽象类中定义受保护的抽象成员,因此存在重要差异。

继承这样的类定义会强制继承者实现抽象成员,但私有地将其作用于类的使用者(尽管必须将其定义为protected,所以除非该类被标记为{{ 1}}进一步的继承者可以访问)。

实质上,您可以使用纯抽象类定义私有接口。这是一个好主意是一个完全不同的问题,但我看到它用于实现设计模式和标准化类设计。

HTH

答案 8 :(得分:1)

您可以使用Interface进行多重继承,但不能使用抽象类进行多重继承。

默认情况下,Interface中的所有方法都是公共的,在抽象类中,只需将您设置为抽象的方法声明为public。

答案 9 :(得分:1)

我只想解决一点(主要是因为已经解决了其他问题):

  

“我们可以使用界面   利用纯抽象类?“

理论上,你可以。但是,在某种程度上,您将失去灵活性和松耦合。对接口进行编码并传递它们更为可取,尤其是在控制反转(IoC)场景和集成的角度,因为这样可以提供更大的可扩展性。

答案 10 :(得分:0)

一个类可以实现多个接口,但只能从一个类(抽象或其他)扩展。如果需要指定接口,则应使用接口,以便类可以实现多个接口。