接口比抽象类更好的情况

7
请告诉我接口在Java中比抽象类更好的情况。
9个回答

12

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

接口是一种编程结构,用于定义您想要公开或向其他模块提供的函数/服务。它是一种契约,您承诺提供某些功能或服务,但隐藏实现方式,以便可以更改实现方式而不影响契约。

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

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


没错。问题不应该是“接口比抽象类更好的情况”,而是“必须使用抽象类而非接口的情况”。 - magicmn

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

3

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

这里有一个很好的链接,比较了两者:接口 vs. 抽象类


2

在Java中,每个类只能有一个直接抽象超类。因此,如果您需要公开两个或多个接口,则接口非常有用。


1
Java不支持多重继承,因此您不能同时实现两个抽象类的类。例如,如果您想在同一个类中拥有MouseListener和ActionListener,则必须使用接口方式实现。

0
当您希望多个类实现接口并且不需要继承默认行为时,接口比抽象类更好。

0
为了提供WebServices或进行JMock测试,您不需要实际的实现,只需要一个接口定义。想一想,当第三方只需要调用您的API时,没有必要将实现返回给他们。

0

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


-1

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

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行为。如果您想要,可以实现多个接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接