所以抽象类可以扩展,但是任何类都可以吗?那么为什么一些特定的类是抽象的而另一些不是呢?
此外,我试图弄清楚,但我总是很困惑,但接口和抽象类之间的实际区别是什么?
感谢任何可以为我解决这个问题的人!
所以抽象类可以扩展,但是任何类都可以吗?那么为什么一些特定的类是抽象的而另一些不是呢?
此外,我试图弄清楚,但我总是很困惑,但接口和抽象类之间的实际区别是什么?
感谢任何可以为我解决这个问题的人!
接口只能描述方法签名,例如
public void add(int a, int b);
实现它的类必须定义方法。
一个抽象类只能被继承,但它仍然可以定义一个方法:
public void add(int a, int b) {
return a+b;
}
任何实现它的类都可以使用该方法。抽象类也可以实现final
方法,因此它们永远不能被扩展它的类重新实现。
抽象类的用处在于分解几个类共有的功能(方法和属性)。此外,说任何类都可以扩展是不正确的,最终类不能扩展。
抽象类与接口不同,因为接口只定义了一个功能契约:需要完成什么,但从不指示如何实现它,而抽象类可以充实一些通用的抽象实现细节,但将具体方面保持开放由其子类实现。在某种程度上,抽象类就像接口和具体类之间的中间点。
抽象类的重点是有意义的默认行为。
抽象类可以在那些有意义的方法中提供有意义的默认实现,并且只留下抽象方法供客户实现。如果客户愿意,客户可以选择覆盖这些默认实现。
接口没有提供这样的机会;它们都是必须由客户端实现的抽象方法。
这不是一个非此即彼的命题;通常两者都提供。例如,参见java.util.Map
and 。java.util.AbstractMap