1.abstract关键字
abstract可以修饰类和方法,用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化,即不允许创建抽象类本身的实例。
注:解决实际问题时,一般将父类定义为抽象类,需要使用这个父类进行继承与多态处理。
抽象类的语法如下:
public abstract class Test{
abstract void testAbstract(); //定义抽象方法
}
其中abstract是定义抽象类得关键字,而使用这个关键字定义的方法称为抽象方法。抽象方法没有方法体,这个方法本身没有意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承,实际上抽象类除了被继承之外没有任何意义。
使用abstract修饰符需要遵守以下规则:
(1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类必须也定义为抽象类,否则编译报错,所以抽象类和非抽象子类之间也存在多态性。
(2)没有抽象静态方法,static和abstract关键字不能在一起使用。
(3)抽象类中也可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法,但是抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
(4)抽象类及抽象方法不能被final修饰符修饰,abstract修饰符与final修饰符不能连用,因为抽象类只有允许创建其子类,它的抽象方法才能被实现,并且只有它的具体子类才能被实例化,而用final修饰的类不允许拥有子类,用final修饰的方法不允许被子类方法覆盖,把abstract修饰符与final修饰符连用,会导致自相矛盾。
(5)抽象方法不能被private修饰符修饰。
@Override
public void method() {
//抽象类不能创建对象
//AbstractTest a = new AbstractTest();
//可以创建抽象类类型的对象,由非抽象子类赋值
//抽象类和非抽象子类之间存在多态性
AbstractTest a = new Test02();
}
2.接口
在JAVA语言中,接口有两种意思:
一指概念性的接口,即指系统对外提供的所有服务,类的所有能被外部使用者访问的方法构成了类的接口。
二是指用interface关键字定义的实实在在的接口,也称为接口类型。它用于明确地描述系统对外提供的所有服务,它能够更加清晰地把系统的实现细节与接口分离。
接口不是类,编写接口的方式和类很相似,但是他们属于不同的概念,类描述属性的对象和方法,接口则包好包含类要实现的方法。
接口的声明形式为:
[public] interface 接口名 [extends 父接口名]
{
[public] [static] [final] 类型 常量字段名 = 值;//声明变量
[public] [abstract] 返回类型 方法名(参数列表);//声明方法
}
接口文件使用时需要注意如下几条:
(1)接口只能用权限修饰符public和默认修饰(一种特殊的抽象类)
(2)每一个接口文件可以包含多个类和接口,但只能有一个和文件名相同的public接口
(3)一个接口生成一个“.class”文件
注:与子类继承抽象父类相似,当类实现了某个接口时,它必须要实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。
3.抽象类与接口的比较
相同点:
都不能被实例化;
都包含抽象方法
区别:
(1)接口中的成员变量只能是public,static和final类型的,而在抽象类中可以定义各种类型的实例变量和静态变量,这是抽象类的优势所在,它可以包含所有子类的共同成员变量,避免在子类中重复定义。
(2)一个类只能继承一个直接的父类,这个父类有可能是抽象类;但一个类可以实现多个接口,这是接口的优势所在。
接口和接口之间有继承关系,而且是多继承关系,多个父接口之间用逗号分隔 接口和类之间没关系,指的是接口在前不能继承或实现一个类 类和接口之间不存在继承关系,但是是实现关系,使用implements表示实现关系,多实现关系 类可以同时继承一个类实现多个接口,但是要求是继承关键字在实现关键字的前面