一、初步认识接口
听起来接口好像比较抽象难以理解,为什么接口会和抽象类有关系呢?那么我们来看看生活中的接口。
就用USB接口来说,USB接口相关工作是按照如下步骤进行的:
- 约定USB接口标准
- 制作符合ISB接口约定的各种具体设备
- 把USB设备插到USB接口上进行工作
而java中的接口和生活中的接口类似,它提供一种约定,使得实现接口的类(结构)在形式上保持一致。
就像USB接口可以让USB风扇插入,可以让USB鼠标插入,可以让U盘让鼠标插入,所服务的对象他们与USB接口接入的线头都是一样的,这就是结构、类相似,都是相似的类。
定义和实现一个简单的接口
注意:接口是一个不能被实例化的类型
语法如下:
public interface 接口名{
//接口成员
}
- 和抽象类不同,定义接口使用interface修饰符。访问修饰符只能是public且可选
- 接口成员可以是全局常量和公共的抽象方法
- 与抽象类一样,实现接口也必须通过子类,子类通过implements关键字实现接口
- 实现接口使用implements关键字
- 实现接口的类必须实现接口中定义的所有抽象方法。接口的实现类允许包含普通方法
二、示例演示
1.定义和实现USB接口,进行数据传输
接口代码
package jiekou;
public interface Usb {
//数据传输抽象方法
void service();
}
实现类
package jiekou;
public class UDisk implements Usb {
@Override
public void service() {
System.out.println("连接usb接口,传输数据");
}
}
2.定义Usb风扇类,实现usb接口,获得电流风扇转动
风扇实现类代码
package jiekou;
public class FengShan implements Usb {
@Override
public void service() {
System.out.println("连接Usb,获得电流,风扇转动");
}
}
3.测试类调用方法实现功能
package jiekou;
public class Test {
public static void main(String[] args) {
//u盘传输数据
Usb uDisk = new UDisk();
uDisk.service();
//usb风扇转动
Usb fengShan =new FengShan();
fengShan.service();
}
}
三、更复杂的接口
- 接口的本身也可以继承接口
- 接口继承的语法格式如下
[修饰符]interface接口名extends 父接口1,父接口2,父接口3,…{
常量定义
方法定义
}
一个普通类只能继承一个父类,但能同时实现多个接口,也可以同时继承抽象类和实现接口。
实现多个接口的语法格式如下:
class类名extends 父类名 implements 接口1,接口2,…{
类的成员
}
注意:
- 接口和类、抽象类是一个层次的概念,命名规则相同
- 修饰符如果是public,则接口在整个项目中可见,如果省略修饰符,该接口只能在当前包中可见。
- 接口中可以定义常量,但不能定义变量,接口中的属性都默认用public static
final 修饰即接口中的属性都是全局静态常量。接口中的常量必须在定义时指定初始值 - 接口中的所有方法都是抽象方法,接口中的方法都默认为public
- 和抽象类一样,接口同样不能被实例化,接口中不能有构造方法
- 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类
- 类只能继承一个父类,但可以通过implements实现多个接口,一个类必须实现接口的全部方法,否则必须定义为抽象类。若一个类在继承父类的同时又实现了多个接口,extends必须在implements之前
这么看来接口的优势在哪里呢?
接口表示一种约定,也表示一种能力,体现了约定和实现相分离的原则。通过面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性。