接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
一、语法规则
接口的定义格式与定义类的格式基本相同,将class关键字换成interface关键字,就定义了一个接口
//接口是一个公共标准,是规范,因此接口中的方法在定义的时候都不给方法体,接口里的方法全是抽象方法
public interface IUSB {
void openUSB();
void closeUSB();
}
注意:
1、创建接口时,接口的命名一般以大写字母I开头
2、接口的命名一般使用“形容词”词性的单词
3、阿里编码规范中规定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性
二、接口的使用
接口不能直接使用,必须要有一个“实现类”来“实现”该接口,实现接口中所有的抽象方法
public class 类名称 implements 接口名称{
......
}
注意:子类和父类是extends继承关系,类与接口之间是implements实现关系
以下举一个笔记本电脑使用USB鼠标和USB键盘的例子:
//接口是一个公共标准,是规范,因此接口中的方法在定义的时候都不给方法体,接口里的方法全是抽象方法
public interface IUSB {
void openUSB();
void closeUSB();
}
public class Mouse implements IUSB{
@Override
public void openUSB() {
System.out.println("打开鼠标");
}
@Override
public void closeUSB() {
System.out.println("关闭鼠标");
}
public void click(){
System.out.println("点击鼠标");
}
}
public class KeyBoard implements IUSB{
@Override
public void openUSB() {
System.out.println("打开键盘");
}
@Override
public void closeUSB() {
System.out.println("关闭键盘");
}
public void input(){
System.out.println("通过键盘输入");
}
}
public class Computer {
public void powerOn(){
System.out.println("电脑开机");
}
public void powerOff(){
System.out.println("电脑关机");
}
public void useUSB(IUSB usb){
usb.openUSB();
if(usb instanceof Mouse){
Mouse mouse = (Mouse)usb;
mouse.click();
} else if(usb instanceof KeyBoard){
KeyBoard keyBoard = (KeyBoard)usb;
keyBoard.input();
}
usb.closeUSB();
}
}
public class TestComputer {
public static void main(String[] args) {
//注意:接口的引用可以指向任意实现该接口的对象,接口的引用可以指向不同实现类的对象,因此就可以实现多态
IUSB use = new Mouse();
use = new KeyBoard();
Computer computer = new Computer();
computer.powerOn();
computer.useUSB(new Mouse());
computer.useUSB(new KeyBoard());
computer.powerOff();
}
}
输出结果为:
三、接口特性
1、接口类型是一种引用类型,但是不能直接new接口的对象
2、接口中的每个方法都是public的抽象方法,即接口中的方法会被隐式的指定为public abstract,其他修饰符都会报错
3、接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
4、重写接口中的方法时,不能使用default访问权限修饰
5、接口中可以含有变量,但是变量会被隐式指定为public static final变量
6、接口中不能有静态代码块、实例代码块和构造方法
接口中不能有实例代码块和构造方法:实例代码块中的内容经过编译后,按照其在类中声明的次序,需要依次加载到构造方法的前面,而构造方法的作用是初始化对象,给对象的普通的成员变量一个合适的初始值,因此构造方法肯定有自己的实现体,即构造方法不能是抽象方法,因为矛盾
7、接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8、如果类没有实现接口类中的所有方法,则类必须设置为抽象类
9、在jdk8:接口中还可以包含default方法,可以在不影响接口的实现类的前提下为接口添加新的功能特性,通过在接口定义的方法的访问修饰符前面加上default,那么接口的实现类可以不用实现该方法
四、实现多个接口
Java中不支持单继承,但是一个类可以实现多个接口
以下代码加深理解:
public interface IRunning {
void run();
}
public interface ISwimming {
void swim();
}
public interface IFlying {
void fly();
}
public interface IAmphibious extends IRunning,ISwimming{
//在Java中一个接口可以去继承多个接口
}
public abstract class Animal {
public String name;
public String gender;
public int age;
//所有的动物都需要吃饭睡觉,这是动物的公共方法
public abstract void eat();
public abstract void sleep();
}
public class Dog extends Animal implements IRunning,ISwimming{
@Override
public void eat() {
System.out.println(name + "吃骨头");
}
@Override
public void sleep() {
System.out.println(name + "睡觉呼呼呼");
}
@Override
public void run() {
System.out.println(name + "用四个蹄子跑");
}
@Override
public void swim() {
System.out.println(name + "狗刨游泳");
}
}
public class Frog implements IAmphibious{//青蛙是两栖动物
@Override
public void run() {
System.out.println("会跑");
}
@Override
public void swim() {
System.out.println("会游泳");
}
}
注:类和类之间是extends继承关系,而且是单继承
类和接口之间是implements实现关系,而且一个类可以实现多个接口
接口和接口之间是extends关系,一个接口可以继承多个接口