3.3.2 接口
前面介绍了类的继承,又介绍了抽象类,但一个子类始终只能有一个父类,也就是说java只支持单继承,不能像C++一样一个子类可以有多个父类的多继承。
但是java提供了类似于多继承的接口。接口其实就是所有方法都是抽象方法的抽象类,但是一个类只能继承一个抽象类,一个类却可以实现多个接口。
接口的定义格式:
public interface 接口名{
public static final 数据类型 常量名 = 常量值;
public 返回值类型 抽象方法名(参数列表);
}
类实现接口:
修饰符 class 类名 implements 接口1,接口2,…{
……实现接口方法……
}
接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法只能声明,不能实现。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
注意:
- 接口中的方法默认是public,也只能是public。
- 接口中的属性默认是public static final,也只能是public static final。
- 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象类。
例1:
public interface Camera{ //接口,摄像机
public void shoot();
}
class Herbivore implements Camera{ //食草动物类实现接口摄像机
public void shoot(){
System.out.println("无人机在草原上拍摄食草动物");
}
}
class Carnivore extends Camera{ //食肉动物类实现接口摄像机
public void shoot(){
System.out.println("伪装摄像机在森林里拍摄食肉动物");
}
}
public class Test{
public static void main(String[] args) {
Herbivore h1=new Herbivore();
h1.shoot();
Carnivore c1=new Carnivore();
c1.shoot();
}
}
上面的代码输出:
无人机在草原上拍摄食草动物
伪装摄像机在森林里拍摄食肉动物
如果在开发中一个子类既要实现接口又要继承抽象类,则可以按照以下格式定义子类:
class 类名 extends 父类名 implements 接口1,接口2,… {
……
}
注意:
一个接口可以继承多个接口,但接口不能继承抽象类。
在JDK8之前,接口是由全局常量和抽象方法组成的,且接口中的抽象方法不允许有方法体。JDK 8对接口进行了重新定义,接口中除了抽象方法外,还可以有默认方法和静态方法(也叫类方法),默认方法使用default修饰,静态方法使用static修饰,且这两种方法都允许有方法体。