抽象类和接口
1. 抽象类
java允许在定义方法时不写方法体。不包含方法体的方法为抽象方 法,抽象方法必须使用abstract关键字来修饰
abstract void shout(); //定义抽象方法shout()
当一个类中包含了抽象方法,该类必须使用abstract关键字来修饰,使用abstract关键字修饰的类为抽象类,具体示例如下。
// 定义抽象Animal
abstract class Animal{
// 定义抽象方法shout()
Abstract int shout();
}
在定义抽象类时需要注意,包含抽象方法的类必须声明为抽象类,但抽象类可以不包含任何抽象方法,只需使用abstract关键字来修饰即可。另外,抽象类是不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法是没有方法体的,不可以被调用。如果想调用抽象类中定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。
子类实现了父类的抽象方法后, 可以正常进行实例化,并通过实例化对象调用方法。
2. 接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类用另外一种方式来定义,即接口。接口是由常量和抽象方法组成的特殊类, 是对抽象类的进一步抽象。
在定义接口时, 需要使用interface关键字来声明, 其语法格式如下。
[public] interface 接口名 [extends接口1,接口2…]{
[public] [static] [final] 数据类型 常量名=常量值;
[public] [abstract] 返回值 抽象方法名 (参数列表);
}
一个接口可以有多个父接口, 它们之间用逗号隔开。Java 使用接口的目的是为了克服单继承的限制,因为一个类只能有—个父类,而一个类可以实现多个接口。接口中的变量默认使用“public static final"来修饰,即全局常量;接口中定义的方法默认使用“public abstract"来修饰,即抽象方法。如果接口声明为public,则接口中的变量和方法全部为public。由于接口中的方法都是抽象方法,因此不能通过实例化对象的方式来调用接口中的方法。此时需要定义一个类, 并使用implements关键字实现接口中所有的方法。—个类可以在继承另—
个类的同时实现多个接口, 这些接口在implements子句中要使用英文逗号( , )隔开。接口的实现类声明格式如下。
[<修饰符>] class <类名> [extends <超类名>] [implements <接口1>,<接口2>, … ]
需要注意的是, —个类实现—个接口,必须给出接口中所有方法的 实现,如果不能实现某方法,也必须写出—个空方法, 在程序中,还可以定义—个接口使用extends 关键字去继承另一个接口。
总结:
- 接口中的方法都是抽象的, 不能实例化对象。
2. 接口中的属性只能是常量。
3. 当—个类实现接口时,如果这个类是抽象类,则实现接口中的部分方法即可,否则需要实现接口中的所有方法。
4. 一个类通过implements关键字实现接口时,可以实现多个接口,被实现的多个接口之间用逗号隔开。
5. 一个接口可以通过extends关键字继承多个接口,接口之间用逗号隔开。
6. 一个类在继承另一个类的同时还可以实现接口,此时,extends关键字位于implements关键字之前(先继承,后实现)。