学习目标:定义接口的静态常量,一个类实现多个接口和接口的多重继承。
定义接口的静态常量
接口中可以定义静态常量,但不能定义成员变量。静态常量使用public static final关键字修饰。例如:定义MathConstant接口,接口中定义圆周率常量,代码如下:
public interface MathConstant {
//定义数学上的圆周率
double PI = 3.1415926;
// 定义自然常数e
public static final double e = 2.71828
}
MathConstant 接口的PI虽然没有显示定义为静态常量,编译器也会为PI加上public static final关键字,将PI转换为静态常量。
为什么接口不能定义成员变量呢?
主要原因是接口不能实例化为对象,成员变量只能在对象被实例化时分配内存。而静态常量在类被加载时,Java虚拟机就会为其分配内存。
一个类实现多个接口
在Java语言中,一个类可以实现多个接口。当一个类实现多个接口时,这个类必须实现所有接口中声明的方法。
案例3:编写汽车程序时,可以把有关汽车的行为分类放到不同的接口中,汽车类可以选择合适的接口来实现这些行为。
在程序中定义汽车运行接口Runner和车身颜色接口BodyColor。在Runner接口定义方法run;在BodyColor接口定定义一个modifyBodyColor方法,用于改变车身颜色。建立Car类实现Runner接口和BodyColor接口。
在PUnit7项目新建automobile包,在automobile包下新建Runner接口。代码如下:
package automobile;
public interface Runner {
// 定义run方法
public void run();
}
Runner接口定义了一个run方法。
在automobile包下新建BodyColor接口。代码如下:
package automobile;
public interface BodyColor {
// 定义modifyBodyColor方法
public void modifyBodyColor(long color);
}
BodyColor接口定义了一个modifyBodyColor方法,用于改变车身颜色。
在automobile包下新建Car类,实现Runner接口BodyColor接口,代码如下:
package automobile;
public class Car implements Runner,BodyColor {
@Override
public void modifyBodyColor(long color) {
System.out.println("修改车身颜色为:" + color);
}
@Override
public void run() {
System.out.println("汽车开始运行");
}
}
Car类实现了Runner接口和BodyColor接口。当一个类实现多个接口时,接口名称之间用英文逗号分隔。
在automobile包下新建测试类CarTest类,测试Car类。代码如下:
package automobile;
public class CarTest {
public static void main(String[] args) {
// 实例化Car对象
Car car = new Car();
// 调用接口方法
car.modifyBodyColor(255);
car.run();
}
}
程序执行结果如下图所示:

接口的继承
接口和类一样,也可以继承。在定义一个接口时,可以让该接口继承另外一个接口。
接口继承和类的继承一样,也是使用“extends”关键字。接口继承语法如下:
public interface 接口名称 extends 继承的接口名称
案例4:定义一个Speed接口,该接口继承Runner接口。Speed接口提供speedUp()和speedDown()方法,speedUp()方法用于加速,speedDown()方法用于减速。
在automobile包下新建Speed接口,该接口继承Runner接口。代码如下:
package automobile;
public interface Speed extends Runner {
public void speedUp();
public void speedDown();
}
在automobile包下新建Bus类,该类实现Speed接口。代码如下:
package automobile;
public class Bus implements Speed {
@Override
public void run() {
System.out.println("汽车开始运行");
}
@Override
public void speedUp() {
System.out.println("汽车开始加速");
}
@Override
public void speedDown() {
System.out.println("汽车开始减速");
}
}
Bus类实现Speed接口。因为Speed接口继承了Runner接口,因此Bus类要实现包括Runner接口在内的所有接口方法。
在automobile包下新建测试类BusTest类,测试BusTest类。代码如下:
package automobile;
public class BusTest {
public static void main(String[] args) {
// 实例化Bus对象
Bus bus = new Bus();
// 调用接口方法
bus.run();
bus.speedUp();
bus.speedDown();
}
}
程序执行结果如下图所示:
