一、接口和抽象类概述
抽象类:在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父,类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。
抽象类的几点说明:
1.抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在继承自抽象类的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的。
2.抽象类不能使用new操作符来初始化。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用。例如, Geometricobject类的构造方法在Circle类和Rectange类中调用。
3.包含抽象方法的类必须是抽象的。然而,可以定义一个不包含抽象方法的抽象类。这个抽象类用于作为定义新子类的基类。
4.子类可以重写父类的方法并将它定义为抽象的。这很少见,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义为抽象的。
5.即使子类的父类是具体的,这个子类也可以是抽象的。例如, object类是具体的,但是它的子类如Geometricobject可以是抽象的。
6.不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
接口:接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的对象的共同行为。在Java中,接口被看作是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件。使用接口或多或少有点像使用抽象类。例如,可以使用接口作为引用变量的数据类型或类型转换的结果等。与抽象类相似,不能使用new操作符创建接口的实例。
二、抽象类和接口的不同
定义的不同:如下图(取自别人的文章,有删除需要请告知)
三、总结
接口和抽象类都可以用于为对象指定共同的行为。如何决定是采用接口还是类呢?通常,比较强的is-a (是一种)关系清晰地描述了父子关系,应该采用类来建模。例如,因为橘子是一种水果,它们的关系就应该采用类的继承关系来建模。弱的is-a关系,也称为iskind-of (是一类)关系,表明一个对象拥有某种属性。弱的is-a关系可以使用接口建模。例,如,所有的字符串都是可以比较的,因此String类实现了Comparable接口。圆或者矩形是一个几何对象,因此Circle可以设计为Geometricobject的子类。圆有不同的半径,并且可以基于半径进行比较,因此Circle可以实现Comparable接口。接口比抽象类更加灵活,因为一个子类只能继承一个父类,但是却可以实现任意个数的接口。然而,接口不能包含数据域。Java 8中,接口可以包含默认方法和静态方法,这对简化类的设计非常有用。