【发布时间】:2011-02-27 14:44:19
【问题描述】:
请告诉我Java中接口比抽象类更好的情况
【问题讨论】:
请告诉我Java中接口比抽象类更好的情况
【问题讨论】:
当您不需要提供任何默认实现时使用接口。
这是一个比较两者的不错的链接:Interface vs. Abstract Class
【讨论】:
你只能有一个直接的抽象超类。因此,如果您需要公开两个或更多接口,则接口很有用。
【讨论】:
当您希望多个类实现该接口并且您不必继承默认行为时,接口比抽象类更好。
【讨论】:
【讨论】:
Java 没有多重继承;因此,您不能拥有一个同时实现两个抽象类的类。例如,如果你想要一个MouseListener 和一个ActionListener 在同一个类中,你必须使用接口方式。
【讨论】:
我想你误解了接口和抽象类的真正含义。
接口是一种编程结构,您可以在其中定义要公开给公共或其他模块的功能/服务。一种合同,您承诺您将提供一些功能或服务,但隐藏了实现,以便可以在不影响您的合同的情况下更改实现。
抽象类是一个部分实现的类,除了作为多个具有实际意义的子类的父类之外,它没有任何实际意义。抽象类是为多个子类提供默认功能的特殊父类。由于没有合适的具体父类,它被创建为抽象的。
在一个好的设计中,您应该始终创建一个界面。但是抽象类是可选的。如果找不到具体的父类,请创建一个抽象类并实现接口,然后为这些接口函数(如果可能)提供默认实现,否则将它们标记为抽象函数并将实现留给子类。
【讨论】:
为了提供 WebServices 或进行 JMock 测试,您不需要实际的实现,您只需要一个接口定义。想一想,只要调用你的 API,就没有必要将实现返回给第三方。
【讨论】:
当您需要在任何类中实现时,因为接口可以在任何类或接口中实现,但抽象类不能这样做,例如在 Applet 中,Applet 类总是在我们的 Applet 应用程序中扩展,在这种情况下,我们不能扩展抽象类。
【讨论】:
抽象类:定义或声明一个更重要的方法。例子: 车辆必须有外形和发动机。所以我们把这个行为放在抽象类中。
abstract class Vehicle {
abstract void shape();
abstract void engine();
}
接口类:除了属性,如移动、喇叭等。因此,接口可以为您的具体类提供额外的行为。
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");
}
}
但我没有实现鸣喇叭行为。如果你愿意,你可以实现多个接口。
【讨论】: