接口(interface)是 Java 程序设计语言常用的高级技术之一,它实际上就是一个纯的抽象类。我们知道,在抽象类中可以不定义或者说定义任意个抽象方法(抽象方法就是只有方法的原型设计,没有方法体实现的这样的方法),而“纯的抽象类”就是说这个抽象类里面的所有方法都是抽象方法。我们知道,Java 不支持类的多继承,但是使用接口可以变通地实现类的多继承。
接口
接口中可以规定方法的原型:方法名、参数列表以及返回类型,但不规定方法主体。
也可以包含基本数据类型的数据成员,但它们都默认为 static 和 final 。
接口的作用
继承多个设计
建立类和类之间的协议
- 将类根据其实现的功能分组用接口代表,而不必顾虑它所在的继承层次,这样就可以最大程度地利用动态绑定,隐藏实现细节。
接口的语法声明格式
[接口修饰符] interface 接口名称 [extends 父接口名]{
... //方法的原型声明或静态常量
}
- 接口的数据成员一定要有初值,且此值将不能再更改,可以省略 final 关键字。
- 接口中的方法必须是“抽象方法”,不能有方法体,可以省略 public 及abstract 关键字。
来个栗子尝尝:
声明一个接口 Shape2D,包括 π 和计算面积的方法原型
interface Shape2D{ // 声明 Shape2D 接口
final double pi = 3.14; // 数据成员一定要初始化
public abstract double area(); // 抽象方法
}
在接口的声明中,允许省略一些关键字,也可声明如下
interface Shape2D{
double pi = 3.14;
double area();
}
由于接口里面只有方法的原型声明,没有方法体的实现,所以跟抽象类一样,接口也是不能够产生实例的,也就是说,接口不能实例化。所以我们不能 new 一个接口类型的对象出来。
那么我们定义好接口之后如何使用接口呢?
接口的实现
利用接口设计类的过程,称为接口的实现,使用 implements 关键字。
语法如下:
public class 类名称 implements 接口名称{
...// 在类中实现接口的所有方法
...// 本类中声明的更多变量和方法
}
注意: 必须实现接口中的所有方法,并且,来自接口的方法必须声明为 public。
栗子:
圆形类
class Circle implements Shape2D{
double radius;
public Circle(double r){
radius = r;
}
public double area(){
return (pi * radius * radius);
}
}
矩形类
class Rectangle implements Shape2D{
int width;
int height;
public Rectangle(int w,int h){
width = w;
height = h;
}
public double area(){
return (width * height);
}
测试类
public class InterfaceTester{
public static void main(String args[]){
Rectangle rect = new Rectangle(5,6);
System.out.println("Area of rect = " + rect.area());
Circle cir = new Circle(2.0);
System.out.println("Area of cir = " + cir.area());
我们也可以声明接口类型的变量,并用它来访问对象
public class InterfaceTester{
public static void main(String args[]){
Shape2D var1,var2;
var1 = new Rectangle(5,6);
System.out.println("Area of var1 = " + var1.area());
var2 = new Circle(2.0);
System.out.println("Area of var2 = " + var2.area());
实现多个接口
语法如下:
public class 类名称 implements 接口名称1,接口名称2{
...// 在类中实现接口的所有方法
...// 本类中声明的更多变量和方法
}
接口的扩展
就像类与类之间可以有继承关系一样,接口与接口之间也可以有继承关系,这种继承关系叫做接口的扩展。
接口扩展的语法:
interface 子接口的名称 extends 接口名称1,接口名称2,...{
...
}
要注意的一点是: 实现一个接口的类也必须实现其所有的超接口。