2012-08-09 67 views
2

在一次采访中,有人问我要证明什么时候选择界面,什么时候选择抽象类,以及在哪两个条件中你只选择两个..我提出了我的分析为接口,这是...选择界面或抽象类

接口是多方之间的类型声明或定义合同 的最佳选择。 如果多个程序员在一个项目的不同模块中工作,他们仍然通过定义接口来使用其他API,而不是等待 以使实际实现准备就绪。

这给我们带来了很多灵活性和速度方面的编码和 的发展。接口的使用还确保了最佳实践,如 “编程接口比实现”,并导致更多的灵活和可维护代码 。

但我没有充足的理由证明抽象类,请指教..!

+0

可能的重复:http://stackoverflow.com/questions/2869222/use-of-java-interfaces-abstract-classes?rq=1 – blackcompe 2012-08-09 18:23:55

+0

抽象类具有类似的优点。 *编程接口并不等同于使用'interface' *,它也可以用抽象类来完成。使用抽象类的主要原因是提供一些可以由其所有子类共享的实现。这里主要的限制是一次只能扩展一个类的能力。 – toniedzwiedz 2012-08-09 18:26:11

回答

21

抽象类用于在一个实体下对许多具体类进行分组。

例如,抽象类Animal。 动物不是具体的东西。这是一个动物家族。但他们都有一些特定的aspectes,例如,每个都有speak()选项(当然,除了鱼和排序)。但每个人都以不同的方式实施。这样你可以覆盖只是不同的方法,例如sleep() or breath()是常见的(同样,鱼是不同的:))。

另一方面,接口更直接地定义'行为'。这就是为什么大多数(如果不是全部的话)Java中的接口以'able'结尾(可比较,可序列化...) 通过实现接口,你告诉其他程序员或者谁曾经使用过你的代码,这个类可以做到这一点,这个。例如,一条狗不是可以动画的。

基本上,总结起来,我认为最好的定义是这样的。 当你有一个类A is kind of B和界面A can do B时使用抽象类。

希望这是帮助。

+0

你偷了我的动物的例子,但我真的很喜欢你的关闭句。 +1对其进行简要总结。 – Petrucio 2012-08-09 18:34:11

+0

我很确定Java库中的大多数接口不会结束'able'。 “有点”vs“可以做到”让我觉得自己是文字游戏。 – 2012-08-09 18:38:32

+0

@Petrucio,对不起。没有看到。这是我大学最广泛使用的例子。汤姆霍金,我不明白你想说什么。至于我所用过的“最有能力”呢。 Runnable,Comprable,Serializable。这是我试图传达的。 – 2012-08-09 18:48:36

5

当您想要提供部分实现时,将使用抽象类。

+0

为了OP的缘故,可能需要更多的澄清。 – 2012-08-09 18:23:39

+0

@丹尼斯我给他的主要原因是,如果他自己做出来的话,他会受益更多。 – Lanaru 2012-08-09 18:28:19

+0

我想我不能与此争论。 – 2012-08-09 18:29:33

1

一个接口用任何实现来声明一个契约。这是该类将包含界面中的方法的保证。

一个抽象类是相似的,任何它的子类也必须实现抽象方法,但是你也可以在其中有代码的工作方法。

我在Android编程中使用了很多接口。抽象类我使用了很多,如果我有很多类似的数据要显示,只需要对实现进行小改动。使用抽象类来减少重复的代码,同时仍然有不同的实现。

+0

java.sql具有可能包含未实现方法的接口。在Java SE 8中,您将能够在接口中使用工作方法代码。 – 2012-08-09 18:34:57

2
  • 如果需要,抽象类可以具有默认行为(实现),接口不能。

  • 抽象类可以为所有方法提供默认行为,或者不提供方法,而接口不能。

  • 抽象类可以具有与所有子类共享的状态,接口不指定状态。

  • 你可以实现多个接口,你只能扩展一个(抽象)类。

+0

从Java SE 8开始,接口可以具有默认实现。 – 2012-08-09 18:35:30

1

您对接口的定义是正确的。

抽象类应该服务于完全不同的目的。作为一个例子,假设您正在为动物模拟器实施几个类。 '动物'定义了几种可能已经具有基本实现的行为,但本身并不是有意实例化的东西。同样的'Mamal',一个'动物'的泡泡。只有一个“老虎”的子类不会是抽象的,但是大多数老虎所做的并不是老虎特有的东西,它们将在抽象的超类中实现。

0

如果一般来讲,一个Abstract class会,当我们需要强制了一些功能上的Sub-ClassSuper-Class让子类有灵活地添加其他functinality需要。

如:

Let Car be the Abstract Super-Class, which has 4 Tyres, 1 Steering ,etc...

Now the Sub classes like Santro i10, Maruti-800, Mahindr Bolero etc are Sub classes, but they need to have 4 Tyres, 1 Steering to be called a car, not they can have a radioor not as an additional feature.

2.Interface在java中被引入,因为没有多重继承。

3.Interface更多关于提供role

如:

Let Dog be the Super-Class

Wild Dogs and Pet Dogs are Sub-Classes.

Wild Behavior and Pet Behavior are Interfaces

Now as both Wild Dog and Pet Dog are dogs, but with different behavious. Then they mustimplement the Wild Behavior or Pet Behavior respectively

0

你想要当你想你的类使用抽象类来实现的是方法,如果情况将要求他们。

一个例子就是如果你有一辆超级车,并且你希望你的小班给你一些车轮,如果他们有的话。如果他们是小船,你就不需要他们,所以合同会迫使你继续执行,而你可能会忽略它,因为你的抽象类。