1.接口的概念
电脑的USB口上,可以插:U盘、鼠标、键盘等所有符合USB协议的设备;数据线的type-c口上,可以插手机,蓝牙耳机充电盒等所有符合规范的设备。由此可以看出:接口就是公共行为的规范表准,在使用时,只要符合规范就可以使用,在Java中,接口可以看成是多个类的公共规范,是一种引用数据类型。
2.语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
public interface 接口名{ //抽象方法 public abstract void method1(); //在接口中public abstract是固定搭配,可以省略不写 public void method2(); abstract void method3(); void method4(); //以上几种定义方法的方式都可以 }
提示:创建接口时,一般以大写字母I开头来命名,命名一般用“形容词”词性的单词,接口中的方法和属性不要加任何修饰符号,保持代码简洁
3.接口使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
public class 类名 implements 接口名{ //... }
注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系。
请实现笔记本电脑使用USB鼠标、USB键盘的例子
1. USB接口:包含打开设备、关闭设备功能
2. 笔记本类:包含开机功能、关机功能、使用USB设备功能
3. 鼠标类:实现USB接口,并具备点击功能
4. 键盘类:实现USB接口,并具备输入功能
//USB接口 public interface USB { //打开设备 void openDevicce(); //关闭设备 void offDevicce(); } //鼠标类,实现USB接口 public class Mouse implements USB{ @Override public void openDevicce() { System.out.println("连接鼠标设备成功"); } @Override public void offDevicce() { System.out.println("鼠标设备断开连接"); } //鼠标点击 public void click(){ System.out.println("鼠标点击成功~"); } }
//键盘类,实现USB接口 public class KeyBoard implements USB{ @Override public void openDevicce() { System.out.println("连接键盘设备成功"); } @Override public void offDevicce() { System.out.println("键盘设备断开连接"); } //输入功能 public void input(){ System.out.println("键盘输入"); } }
//电脑类, public class Computer { //开机 public void openComputer(){ System.out.println("打开电脑"); } //关机 public void offComputer(){ System.out.println("关闭电脑"); } //使用USB接口设备 public void useDevicce(USB usb){ usb.openDevicce(); if (usb instanceof Mouse){ Mouse mouse= (Mouse)usb; mouse.click(); } if (usb instanceof KeyBoard){ KeyBoard keyBoard=(KeyBoard)usb; keyBoard.input(); } usb.offDevicce(); } }
//测试类 public class Text { public static void main(String[] args) { //实例化电脑 Computer computer=new Computer(); //打开电脑 computer.openComputer(); System.out.println("===="); //使用鼠标设备 computer.useDevicce(new Mouse()); System.out.println("===="); //使用键盘设备 computer.useDevicce(new KeyBoard()); //关闭电脑 computer.offComputer(); } }
4.接口特性
1. 接口类型是一种引用类型,但不能直接new接口的对象。
public class TestUSB { public static void main(String[] args) { USB usb = new USB(); } } //编译报错,USB是抽象类型,无法实例化
2.接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是public abstract,其他修饰符都会报错)。
public interface USB { private void openDevice(); // 编译 报错,不允许使用修饰符private void closeDevice(); }
3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现。
public interface USB { void openDevice(); void closeDevice(){ System.out.println("关闭USB设备"); }// 编译报错,因为接口中的方法默认为抽象方法,不能带有方法体 }
4. 重写接口中方法时,不能使用默认的访问权限。
public interface USB { //打开设备 void openDevicce(); //关闭设备 void offDevicce(); } public class Mouse implements USB{ @Override void openDevicce() { System.out.println("连接鼠标设备成功"); } //编译报错,重写时不能使用默认修饰符
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量。
public interface USB { int a=1;//默认被 final public static 修饰 //打开设备 void openDevicce(); //关闭设备 void offDevicce(); } public class Text { public static void main(String[] args) { System.out.println(USB.a); //可以通过接口访问,说明是静态的 System.out.println(a); //可以直接访问,说明是公开的 USB a=10; //编译报错,说明a具有final属性 } }
6. 接口中不能有静态、动态代码块和构造方法。
public interface USB { public USB(){ } //编译报错 { } // 编译报错 static{ } //编译报错 void openDevice(); void offDevice(); }
7. 接口虽然不是类,但接口编译完成后字节码文件的后缀格式也是.class。
8. 如果类没有实现接口中的所有抽象方法,则类必须设为抽象类。
9.jdk8中:接口中还可以包含default方法。