Java–接口
如果一个抽象类中的所有方法都是抽象的,则可以将这个类定义为Java中的另一种形式——接口。
接口是一个特殊的抽象类,它不能包含普通方法,其内部的所有方法都是抽象方法,它将抽象进行的更为彻底。
jdk8中,对接口进行了重新定义,接口中除了抽象方法外还可以有默认方法(使用default修饰)和静态方法(使用static修饰),并且这两种方法允许有方法体。
在定义接口时,使用interface关键字来声明
接口定义语法:
[修饰符] interface 接口名[extends 父接口1,父接口2...]{//同时可以继承多个父接口,解决类的单继承的限制
[public] [static] [final] 常量类型 常量名 = 常量值;
[public] [abstract] 方法返回值类型 方法名([参数列表]);
[public] default 方法返回值类型 方法名([参数列表]){
//方法体
}
[public] static 方法返回值类型 方法名([参数列表]){
//方法体
}
}
静态方法可以通过“接口名.方法名”的形式来调用,而抽象方法和默认方法只能通过接口实现类的实例对象来调用。
因此需要定义一个接口的实现类,该类通过implements关键字实现当前接口并且实现接口中的所有抽象方法。
定义接口的实现类语法:
[修饰符] class 类名 [extends 父类名] [implements 接口1,接口2,...]{
}
示例
interface Animal {
int ID = 1;// 定义全局常量
void breathe();// 定义抽象方法breathe
// 定义一个默认方法
default void getType(String type) {
System.out.println("该动物属于:" + type);
}
// 定义一个静态方法
static int getID() {
return Animal.ID;
}
}
class Dog implements Animal {
// 实现breathe方法
public void breathe() {
System.out.println("狗在呼吸");
}
}
public class Example13 {
public static void main(String[] args) {
System.out.println(Animal.getID()); // 通过接口名调用类方法
Dog dog = new Dog(); // 创建Dog类的实例对象
System.out.println(dog.ID); // 在实现类中获取接口全局常量
dog.breathe();
dog.getType("犬科");
}
}
升级版
interface Animal {
int ID = 1;// 定义全局常量
void breathe();// 定义抽象方法breathe
// 定义一个默认方法
default void getType(String type) {
System.out.println("该动物属于:" + type);
}
// 定义一个静态方法
static int getID() {
return Animal.ID;
}
}
//定义了LandAnimal接口,并继承了Animal接口
interface LandAnimal extends Animal {
void run();// 定义抽象方法run()
}
class Dog implements LandAnimal {
// 实现breathe方法
public void breathe() {
System.out.println("狗在呼吸");
}
public void run() {
System.out.println("狗在陆地上跑");
}
}
public class Example14 {
public static void main(String[] args) {
System.out.println(Animal.getID()); // 通过接口名调用类方法
Dog dog = new Dog(); // 创建Dog类的实例对象
System.out.println(dog.ID); // 在实现类中获取接口全局常量
dog.breathe();
dog.getType("犬科");
dog.run();
}
}
一个类在继承一个类的同时还可以实现接口,此时,extends关键字必须位于implements关键字之前。
class A extends B implements C{//先继承再实现
}
一个类在继承一个类的同时还可以实现接口,此时,extends关键字必须位于implements关键字之前。
class A extends B implements C{//先继承再实现
}