请告诉我接口比Java中的抽象类更好的情况
答案 0 :(得分:8)
我认为你误解了界面和抽象类的真正含义。
接口是一种编程结构,您可以在其中定义要向公共模块或其他模块公开的功能/服务。您承诺提供某些功能或服务的合同类型,但隐藏实施以便在不影响合同的情况下更改实施。
抽象类是一个部分实现的类,除了作为具有实际意义的多个子类的父类之外,它没有任何实际意义。抽象类是特殊的父类,它为多个子类提供默认功能。由于没有合适的具体父类,因此它被创建为抽象。
在一个好的设计中,你应该总是创建一个界面。但抽象类是可选的。如果找不到具体的父类,则创建一个抽象类并实现该接口,然后为这些接口函数提供默认实现(如果可能),否则将它们标记为抽象函数,并将实现留给子类。
答案 1 :(得分:6)
答案 2 :(得分:2)
当您不需要提供任何默认实现时,请使用接口。
这是一个比较两者的好链接:Interface vs. Abstract Class
答案 3 :(得分:2)
您只能拥有一个直接的抽象超类。因此,如果需要公开两个或更多接口,接口非常有用。
答案 4 :(得分:1)
Java没有多重继承;因此,您不能拥有一次实现两个抽象类的类。例如,如果您想在同一个类中使用MouseListener
和ActionListener
,则必须以接口方式进行。
答案 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行为。如果需要,可以实现多个接口。