在Java中,抽象类的抽象方法和接口的抽象方法除了访问权限有什么主要区别吗?请开导我。我用的是Java7
技术上abstract
类和interface
类之间的方法或签名没有区别。但是方法的使用是有区别的。
public class Son extends AbstractChild , Father{//Cannot do as multiple inheritance not supported
}
public class Son extends AbstractChild implements Naughtiness, Cuteness{//Allowed}
根据JLS,接口的方法是public
和abstract
,并且正如您提到的,接口的访问修饰符默认为public
。
然而,在Java 8中,接口是游戏规则的改变者。接口将具有与抽象类相同的功能,您可以拥有该方法的默认实现。
更多信息,请参考- http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
一方面你们有一些技术上的差异:
- 接口方法隐式
public abstract
- 接口可以多次使用
extends
- 抽象类可以包含一些实现的功能(接口只能在JDK 8+中拥有)
在实践中,开发人员使用它们来实现稍微不同的功能:
- 抽象类主要用于继承树的顶层(假设类Animal, Cat扩展了Animal, Dog扩展了Animal)。动物可能有一些所有动物共同的功能(例如getName())
- 接口只是标记行为。(Annoyable接口,Mosquito实现Annoyable, Telemarketer实现Annoyable)。电话推销员和蚊子都有
annoy()
方法。
抽象方法不包含默认实现,依赖于实现类。抽象方法以;并且不使用{},因为该方法不能包含实现。它的子类必须提供实现。抽象类可以有抽象方法和非抽象方法。抽象类的目的是隐藏内部细节,只向用户显示实现。