如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。
声明了方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法,但可以有具体实现的方法,抽象类里没有具体实现的方法必须指定为抽象类型,否则会出错的。抽象方法不能有方法体。
再次强调:一个类不能既被声明为 abstract的,又被声明为final的。
接口(interface)是抽象类的变体,只可以定义却不能实现。在接口中,所有方法都是抽象的(即接口的方法都没方法体)。多继承性可通过实现这样的接口而获得。接口只可以定义static final成员变量。接口的实现与继承相似,除了该实现类不能从接口定义中继承行为。当类实现接口时,它必须定义或实现(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于是抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
从某种意义上说,interface是一种特殊形式的abstract class,也不能使用final修饰符
abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface
一个非抽象类(注意是非抽象类!)实现一个接口时,必须实现接口的所有方法,抽象类则不必实现所有方法。
一个Interface的方所有法访问权限(visibility)自动被声明为public,确却的说,一个Interface的所有方法只能是public的,你可以显式声明一个方法是public(不推荐),但是不能声明它是private或protected.但是当一个类实现某个接口,定义接口的方法时,必须且只能声明为public,否则编译将通不过。