接口是个比抽象类更抽象的一个抽象类
上个文章讲解了抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更特殊的"抽象类"——接口(interface).
接口中不能包含普通方法,这与抽象类不同,在接口中,所有的方法必须都是抽象的。接口的概念就是建立在封装的基础之上而接口的继承,多态以及接口在实际开发中的普遍应用,足以让其java面向对象特点为一体。
大家有的有U盘,平时将文件资料放在里面,平时使用时可以将其与计算机上的usb接口进行连接,点开U盘所在的文件夹即可对U盘中的内容进行查阅,但是有没有想过,U盘的品牌,容量各不相同,为什么计算机能够识别,并且都能提供一个或多个盘符,供用户操作呢?其实,这就是接口的应用了
对于 USB 接口来说,只需要规定任何一个 U 盘连接时,必须实现读和写的功能,而
不需要关注 U 盘是哪家厂商制造的,容量是多少。它需要关注的是,对于任意一款 U 盘来
说,是否满足 USB 接口定义的规范,如果是就能识别与操作它。由此可见,能正常使用的U 盘必然实现了 USB 接口制定的规范。
让规范和实现相分离,就是使用接口的主要目的,更进一步说,有了接口,可使软件系统中各组件之间面向接口耦合,这是一种松耦合的设计,为系统提供更好的可扩展性和可维护性。可以说,接口使得即插即用在程序中成为可能。因此,接口定义的是多个类共同的行为规范,这些行为是与外部交流的通道,这就意味着接口通常定义一组公用的未实现的方法。
定义一个接口需要使用interface关键字,定义语法如下
[public] interface 接口名 [extends 父接口名]{
类型 常量字段名 = 值;
...
返回类型 方法名(参数列表);
...
}
那我们来创建一个USB接口和两个实现类
package com.wangzilong.Interface;
//USB接口
public interface USB {
//读的抽象方法
public void read();
//写的抽象方法
public void write();
}
package com.wangzilong.Interface;
//金士顿U盘
public class Kingston implements USB {
//实现USB中的抽象方法read()
public void read() {
System.err.println("金士顿U盘正在读取信息!");
}
//实现USB中的抽象方法write()
public void write() {
System.out.println("金士顿U盘正在写入信息!");
}
}
package com.wangzilong.Interface;
//苹果mp3
public class Apple implements USB {
//实现USB中的抽象方法read()
public void read() {
System.out.println("苹果MP3正在读取信息");
}
//实现USB中的抽象方法write()
public void write() {
System.out.println("苹果MP3正在写入信息");
}
}
对于USB接口来说,其中有两个抽象方法read()和write(),注意这两个方法由于被放置在接口中,所以不需要再声明为abstract即己为抽象方法。Kingston类和Apple类分别实现了接口,实现了其中的抽象方法。为了生产这些产品,我们继续编写代码,创建一个简单的工厂类。
package com.wangzilong.Interface;
/*
* USB生产厂类,可生产U盘,mp3等元件
*/
public class UsbFactory {
public static USB createUsb(String type) {
//创造一个USB类型的变量
USB usb;
//就收并对比字符串参数type的值,判断创建的是什么样的USB元件
if ("kingston".equals(type)) { //如果type与字符串“Kingston”相等,则执行方法体代码
usb = new Kingston(); //对象实例化
} else if ("apple".equals(type)) { //如果type与字符串“apple”相等,则执行方法体代码
usb = new Apple(); //对象实例化
} else {
usb = null;
// 报告错误
}
return usb; //返回usb的值
}
}
在UsbFactory类中,静态方法createUsb()通过接收并对比字符串参数type的值,来决定创建什么养的USB兼容元件。如果传递过来的是"kingston",则创建金士顿U盘;如果传递来的是“apple”,则创建苹果mp3;如果什么也没有传递,就不创建任何对象,并报告错误。
下面对这些类测试
package com.wangzilong.Interface;
public class Test {
public static void main(String[] args) {
// 用工厂创建U盘,注意是面向接口而不是具体类的
USB usb;
usb = UsbFactory.createUsb("kingston"); //"接口"实例化
usb.read();
usb.write();
// 用工厂创建mp3
usb = UsbFactory.createUsb("apple"); //"接口"实例化
usb.read();
usb.write();
}
}
在mian()方法中,使用UsbFactory工厂创建了U盘对象及mp3对象,均由接口USB引用,我们程序不在面向某个或某某些对象,而是面向接口运转的。
运行结果如下
对于该例子还需要注意一点,就是所有实现类在实现接口中的抽象方法时,其修饰符必须时public。