关于java:纯抽象类和接口

pure abstract class and interface

本问题已经有最佳答案,请猛点这里访问。

有人能告诉我一个完全抽象的类和一个接口到底有什么区别吗?

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

纯抽象类和接口之间是否有区别?接口的用途是什么?在使用接口的地方,我们可以使用纯抽象类?


完成之前的答案:

接口是一个"契约"。如果一个类实现了一个接口,它必须提出接口中列出的所有服务。

抽象类是一个骨架。它定义了它的扩展类的工作方式,同时让它们具有一些独特的自由空间(抽象方法)。

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


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

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

还可以看到:接口与抽象类以及Java教程


在爪哇和C.*中,可以使用多个接口从仅派生一个类来继承,


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

例如(在Java中),

假设您希望所有扩展类实现ToString()、Equals()和HashCode()。

可以为该协定创建一个名为forcesomemethods的接口,但这些方法是由对象隐式实现的。

使forceSomeMethods成为一个纯抽象类,其中toString()等作为抽象方法,将强制所有子类实现这些方法。


It's not a very theorotical explaination but, programatically it's all correct

1
2
3
4
5
6
7
8
9
10
                                    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

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


既然问题是关于纯抽象类的,那么我认为答案将与继承和范围有关。这是我很多次想知道的事情,这就是我想出来的。

显然,与多重继承相关的特性已经在前面得到了回答,所以我不会再讨论其中的任何一个。但范围很大。

在接口中,不能定义成员的访问修饰符,因为它们是隐式公共的,…您正在为其最终实现定义公共接口。这里有一个重要的区别,因为您可以在纯抽象类中定义受保护的抽象成员。

从这样的类定义继承将强制继承者实现抽象成员,但将其私有化给类的使用者(尽管它必须定义为protected,所以除非类被标记为sealed,否则其他继承者将有权访问)。

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

高温高压


有三个不同之处:

  • 接口只能声明公共方法(即没有受保护或包私有可见方法),不能声明任何字段
  • 子类最多只能扩展一个抽象类,但可以实现任意数量的接口
  • 抽象类还可以有一些或所有方法的实现

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


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

    "Where interface is being used we can
    make use of pure abstract class?"

    理论上,你可以。但是,您将在某种程度上失去灵活性和松耦合。更可取的做法是将代码转换为接口并传递这些接口,尤其是在控制反转(IOC)场景中以及从集成的角度来看,因为这样可以获得更大的扩展性。


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

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


    一个类可以实现多个接口,但只能从一个类(抽象的或其他的)扩展。如果您需要指定一个接口,那么您应该使用一个接口,这样类就可以实现您的多个接口。