Logo

郎哥编程

接口的实现和继承

2021-06-13 217

学习目标:定义接口的静态常量,一个类实现多个接口和接口的多重继承。

定义接口的静态常量

接口中可以定义静态常量,但不能定义成员变量。静态常量使用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();
 
    }
}

程序执行结果如下图所示:

01.jpg

接口的继承

接口和类一样,也可以继承。在定义一个接口时,可以让该接口继承另外一个接口。

接口继承和类的继承一样,也是使用“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();
 
    }
}

程序执行结果如下图所示:

02.png

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论