关于接口:Java – 如果你可以扩展任何类,那么一些是抽象的重点是什么?

Java - If you can extend any class then what is the point of some being abstract?

所以抽象类可以扩展,但是任何类都可以扩展吗?那么,为什么某些特定的类是抽象的,而其他的类不是?

此外,我试图弄明白,但是我总是很困惑,但是接口和抽象类之间的实际区别是什么?

感谢任何能帮我解决这个问题的人!


接口只能描述方法签名,例如

1
public void add(int a, int b);

实现它的类必须定义方法。

抽象类只能继承,但它仍然可以定义一个方法:

1
2
3
public void add(int a, int b) {
    return a+b;
}

任何实现它的类都可以使用这个方法。抽象类也可以实现final方法,因此它们永远不能由扩展它的类重新实现。


抽象类的点是有意义的默认行为。

抽象类可以在那些有意义的方法中提供有意义的默认实现,并且只保留抽象方法供客户端实现。如果愿意,客户机可以选择重写这些默认实现。

接口不提供这样的机会;它们都是必须由客户机实现的抽象方法。

这不是一个非此即彼的主张;通常两者都有。例如,参见java.util.Mapjava.util.AbstractMap


抽象类的有用性在于将多个类共用的功能(方法和属性)考虑在内。而且,说任何类都可以扩展是不正确的,最后的类不能扩展。

抽象类不同于接口,因为接口只定义了一个功能契约:需要完成什么,但从不指示如何实现它,而抽象类可以充实一些一般的、抽象的实现细节,但让具体方面由其子类实现。在某种程度上,抽象类就像是接口和具体类之间的中间点。