接口优于抽象类的情况

时间:2010-06-04 03:10:52

标签: java oop

请告诉我接口比Java中的抽象类更好的情况

9 个答案:

答案 0 :(得分:8)

我认为你误解了界面和抽象类的真正含义。

接口是一种编程结构,您可以在其中定义要向公共模块或其他模块公开的功能/服务。您承诺提供某些功能或服务的合同类型,但隐藏实施以便在不影响合同的情况下更改实施。

抽象类是一个部分实现的类,除了作为具有实际意义的多个子类的父类之外,它没有任何实际意义。抽象类是特殊的父类,它为多个子类提供默认功能。由于没有合适的具体父类,因此它被创建为抽象。

在一个好的设计中,你应该总是创建一个界面。但抽象类是可选的。如果找不到具体的父类,则创建一个抽象类并实现该接口,然后为这些接口函数提供默认实现(如果可能),否则将它们标记为抽象函数,并将实现留给子类。

答案 1 :(得分:6)

  • 一个类可以实现多个接口,但它只能扩展一个抽象类。
  • 接口允许创建封装具体类的代理。框架广泛使用它来拦截对具体类的方法调用(例如,在执行方法之前启动事务或写入日志)。

答案 2 :(得分:2)

当您不需要提供任何默认实现时,请使用接口。

这是一个比较两者的好链接:Interface vs. Abstract Class

答案 3 :(得分:2)

您只能拥有一个直接的抽象超类。因此,如果需要公开两个或更多接口,接口非常有用。

答案 4 :(得分:1)

Java没有多重继承;因此,您不能拥有一次实现两个抽象类的类。例如,如果您想在同一个类中使用MouseListenerActionListener,则必须以接口方式进行。

答案 5 :(得分:0)

当您希望多个类实现该接口并且您不必继承默认行为时,接口优于抽象类。

答案 6 :(得分:0)

为了提供Web服务或进行JMock测试,您不需要实际的实现,只需要一个接口定义。考虑一下,当他们需要做的只是调用你的API时,没有必要将实现返回给第三方。

答案 7 :(得分:0)

当你需要在任何类中实现时,因为接口可以在任何类或接口中实现,但是抽象类不能这样做,例如在Applet中,Applet类在我们的Applet应用程序中扩展,在这种情况下,我们无法扩展抽象类。

答案 8 :(得分:-1)

抽象类:定义或声明一个更重要的方法。例: 车辆必须具有形状和引擎。因此,我们将此行为放在Abstract类中。

abstract class Vehicle {
  abstract void shape();
  abstract void engine();
}

接口类:除了诸如move,honk等属性外,接口还为您的具体类提供了额外的行为。

interface Honk{
void honk();
}
interface moveable{
void move();
}

class Car extends Vehicle implements Moveable {
  @Override
  void shape() {
    System.out.println("car's shape");
  }
  @Override
  void Engine() {
    System.out.println("car's engine");
  }
 @Override
  void move() {
    System.out.println("car's can move");
  }
}

但是我没有实现Honk行为。如果需要,可以实现多个接口。