l 抽象类
(1)抽象类可以只包含抽象方法,也可以拥有普通的成员变量或方法,抽象类的子类必须覆盖父类的所有抽象方法
(2)如果一个类不是抽象类,就不能在该类中定义抽象方法。
(3)抽象类可以有构造方法,但抽象类不会有实例,也不能直接用构造方法来生成实例,一般可通过其子类进行实例化
(4)对于类,不能同时用final和abstract说明,对于成员方法,不能同时用static和abstract说明
Tips:使用final的类不能被继承,使用abstract的类则专门用于被子类继承,因此同时使用final和abstract将产生矛盾。使用static关键字的方法能在不实例化对象时就使用,而使用abstract关键字的方法没有方法体,必须要靠子类进行具体实现,因此一个成员方法同时使用abstract和static关键字没有任何必要。
l 接口
在Java语言中,一个类只能有一个父类,但Java提供了接口用于实现多重继承,一个类可以有一个父类,并能实现多个接口,接口是一个特殊的类,由常量和抽象方法组成。
定义格式:
public interface 接口名extends 父接口名列表{
数据类型 变量名=常量值;//常量域声明
返回类型 方法名(参数列表)[throw 异常列表];//抽象方法声明
}
Tips:(1)接口具有继承性,一个接口还可以继承多个父接口,父接口间用逗号分隔。
(2)系统默认接口中所有成员变量的修饰都是加上public ,static和final的,接口内部的所有成员变量即使不加修饰词,系统也会默认具有public ,static和final属性的,因此在接口中定义的变量都是不能改变的值
(1) 系统默认接口中所有成员方法的修饰都是public和abstract,即使接口内的成员方法不加public和abstract修饰词,系统也默认其具有public和abstract属性。
(2) 接口只包含常量定义和抽象方法。
(3) 接口本身具有抽象属性,因此不需要使用abstract关键字,接口的访问控制权限有public和默认权限,不具有protected和private权限
(4) 接口不含构造方法,由于接口没有构造方法,因此不能直接通过接口生成接口的实例对象
接口的实现:
格式:class <类名> implements 接口名1,接口名2,….
一个接口可被一个或多个类实现,当一个类实现了一个接口,它必须实现接口中所有的方法,这种实现其实就是方法覆盖,由于方法覆盖不能缩小父类方法的访问权限,而接口内所有的方法均默认public权限,因此实现这些方法时,必须设定访问权限也是public,否则会产生访问权限错误。
通过使用接口可以来引入多个类的共享常量,接口中定义成员变量的都是加上public ,static和final的,因此可以把这些变量都作为常量看待,然后在实现它的类中直接调用。
接口是可扩展的,可通过运用关键字extends被其他接口继承,因此实现该接口的类,它的语法与继承类是一样的,即当一个类实现了一个继承了另一个接口的接口时,它必须实现接口继承列表中定义的所有方法。如A继承了接口B,接口B继承了接口C,则实现接口A的类需要实现接口A,B,C里所有的方法。
接口与抽象类的区别:
(1) 接口可以多重继承,而抽象类不可以。
(2) 抽象类内部可以有成员变量,可以有具体的成员方法,而接口则没有实现的方法,只有常量。
(3) 接口与实现它的类不构成继承体系,即接口不是类体系的一部分,因此,不相关的类也可以实现相同的接口,而抽象类是属于一个类的继承体系,并且一般位于类体系的顶层。
(4) 接口能通过实现多个接口实现多重继承,能够抽象出不相关的类之间的相似性,而抽象类不行。
(5) 在实现运行时多态的机制上,通过设计抽象类,由子类实现父类所定义的方法,也能实现Java动态调度机制,但Java是一种单继承语言,一般情况下,某个具体类可能已经有了一个父类,因此在实现过程中,对一个具体类的可插入型的设计,就变成了对整个等级结构中所有类的修改,而接口的设计避免了这个问题,在一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响此类的所有子类,但不会影响此类的任何父类,此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择换掉所有这些方法,或者其中的某些方法,这时候,这些子类具有可插入性。
Tips:有没有可能某个类实现了一个接口,却没有实现该接口中的所有方法?
这个类只要符合下列情况之一,就不需要实现接口中的所有方法:
(1) 在其父类中已经实现了相关的和接口同名的方法
这个类是抽象类。