接口
我们生活中经常听到usb接口,也知道电脑上有usb接口,那么接口是什么?
在我理解就是usb接口定义了一种标准或者说是规范,只有符合此标准的设备都可以使用usb接口。比如鼠标、键盘、打印机,我们不需要在电脑上开3个插槽来接这3个设备,只需要一个usb接口就能搞定。
在Java中,接口有点像抽象类,但是也有不同。抽象类强调的是一种 is a 的关系,比如学生是人类、工人是人类等等。而接口又有不同,接口更像是一种like a的关系,鼠标、键盘、打印机可以通过usb接口联系到一起。
接口的定义(jdk8以前):抽象方法与全局常量的集合(纯粹版的抽象类),Java中使用interface关键字来定义接口
//一个简单的接口
interface IMyInterface{
public static final String msg = "test";
public abstract void print();
}
接口的作用
1.定义操作标准
2.表示能力
3.分布式开发之中,暴露远程服务方法
接口优先原则:在一个操作既可以使用抽象类又可以使用接口的时候,优先使用接口。
接口命名:接口使用I开头
注意:
- 子类要想使用接口,使用implements实现接口,一个子类可以同时实现多个父接口(避免了Java中单继承局限)
interface IMyInterface{
String msg = "test";
void print();
}
interface IMyInterface_Second{
String msg2 = "test2";
void print2();
}
//一个子类可以实现多个接口,也要重写多个接口的所有抽象方法
class MyInterfaceImpl implements IMyInterface,IMyInterface_Second{
public void print(){
System.out.println(msg);
}
public void print2(){
System.out.println(msg2);
}
}
- 父接口可以相互转换(前提是两个父接口有一个共同的实现子类)
interface IMyInterface{
String msg = "test";
void print();
}
interface IMyInterface_Second{
String msg2 = "test2";
void print2();
}
class MyInterfaceImpl implements IMyInterface,IMyInterface_Second{
public void print(){
System.out.println(msg);
}
public void print2(){
System.out.println(msg2);
}
}
class Test{
public static void main(String[] args) {
IMyInterface my = new MyInterfaceImpl();
IMyInterface_Second my2 = (IMyInterface_Second)my;//父接口的相互转换
my2.print2();
}
}
- 子类的命名规范:接口名为IMyInterface,子类实现此接口,命名为MyInterfaceImpl
接口的应用
/**
* 定义一个USB接口
*/
interface USB{
void insert();//usb设备插入
void setup();//usb设备安装驱动
void work();//usb设备正常运行
}
/**
* 定义一个电脑类
*/
class Computer{
public void plugIn(USB usb){
usb.insert();
usb.setup();
usb.work();
}
}
/**
* 定义一个USB设备实现接口
*/
class Mouse implements USB{
public void insert(){
System.out.println("鼠标插入");
}
public void setup(){
System.out.println("鼠标安装驱动");
}
public void work(){
System.out.println("鼠标正常工作");
}
}
class UDisk implements USB{
public void insert(){
System.out.println("U盘插入");
}
public void setup(){
System.out.println("U盘安装驱动");
}
public void work(){
System.out.println("U盘正常工作");
}
}
class Test{
public static void main(String[] args) {
Computer computer = new Computer();
computer.plugIn(new Mouse());
computer.plugIn(new UDisk());
}
}
通过以上代码我们发现:接口和对象多态性的概念结合之后,对于参数的统一更加明确了。而且可以发现接口是在
类之上的设计抽象。
接口的使用限制
1.接口中只允许public权限(无论是常量还是方法,都是public权限,即便不写权限修饰符也是public)
99%的接口只提供抽象方法。很少在接口里提供全局常量
阿里编码规约:接口中不用出现任何修饰符号,public也不加
2.当子类既需要实现接口又要继承抽象类时,先使用extends继承一个抽象类,而后使用implements实现多个接口。
3.一个抽象类可以使用implements实现多个接口,接口不能继承抽象类
4.接口可以使用extends继承多个接口(接口多继承)
5.接口可以定义一系列的内部结构,包括:内部普通类,内部普通类,内部接口。其中,使用static定义的内
部接口就相当于一个外部接口。