何时使用抽象类或接口?

为什么创build抽象或接口类,或者什么时候应该使用抽象或接口类?

当你只想声明一个类必须拥有哪些方法和成员时,使用接口。 任何实现接口的人都必须声明和实现接口列出的方法。

如果你也想有一个默认的实现,使用抽象类。 任何扩展抽象类的类都必须实现其抽象方法和成员,并且将抽象类的其他方法的一些默认实现,您可以重写或不重写。

– EDIT – 忘了提,Earwicker提醒我

最后,你可以实现尽可能多的接口,但只扩展一个类(不论是否抽象)。 在select之前记住这一点。

关键的区别是你可以在一个类中implement多个接口,但只能extend一个抽象类。 这是因为抽象类也可以定义存储数据的字段,而接口则不能。

抽象类是一个类,没有实现它的一些方法。 显然它不能被实例化。 您必须从一个抽象类inheritance,并在另一个类中实现抽象方法。

接口根本没有类(所以不要称之为接口类)。 接口定义了方法的签名而没有任何实现。 另外接口没有成员字段。 如果您在类中实现接口,则必须为接口提供的方法提供实现。

为一些东西定义一个通用的API是有意义的,它们可以有完全不同的实现。 抽象类对于主要相同的类更有用,但有一些细微的差别。 你可以结合这两种方法。

一个很好的例子就是Java类库的集合框架 。 您有界面列表,它定义了列表必须如何行事。 一些实现是例如ArrayList和LinkedList。 因为它们的行为相似,所以在抽象类AbstactList中实现的function相同,都inheritance了这一点。

接口基本上是一个“合同”。 当你定义一个接口时,你正在定义一个合约。 在抽象类被扩展的地方,接口是被实现的。

我们来看一个例子。

 public interface Friend { void hello(); } 

现在你已经定义了一个合同,说任何想要实现Friend类都需要为hello()方法提供一个定义。

这是一个实现:

 public class myFriend implements Friend { public void hello() println("Done"); } 

现在我的myFriend已经履行了合同。 现在的问题是:应该在哪里使用接口?

接口帮助您定义必须实施的行为。 假设你有一个定义了一些function的类A, 只有当它们定义了特定的行为(方法)时,才希望其他类应该使用此类function。 你从接口的angular度来执行这个限制。

SamuelCarrijo似乎很好地回答了这个问题。

另外对于Java,一些框架需要一个接口来处理。 我想(例如) dynamic代理 ,或一些客户端/服务器代理框架。 这是因为他们在对象上使用自省来确定由对象实现的接口实现的方法。 所以偶尔你必须实现一个对象的接口,或许你通常不会打扰。

注意接口的这个原因是特定于Java的。

在构buildinheritance层次结构时使用抽象类。 但是,大多数inheritance层次不应该太“深”(即inheritance层次太多)。 许多面向对象的devise书籍都会支持接口而不是inheritance(我读过的一本书曾经引用开发人员的话说,“inheritance是你不会实现的单一最酷的[面向对象的]特性”),因为这样可以将类分配给行为“通过合同“,其中合同是界面。

值得注意的是samuelcarrijo的答案 – 如果你想有一个方法的默认实现,你将不得不使用一个抽象类,具有该方法的具体实现给它一个默认的实现。 这个默认的实现可以在子类中重写。

希望这可以帮助!