一、定义及使用
解释:接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要...则必须能... ”的思想。继承是一个“是不是”的关系,而接口实现则是“能不能”的关系。
规则:
① 接口中不能定义构造器,即接口不可实例化。
② 类可以实现多个接口
③ 接口与接口之间可以多继承
④ 接口的具体使用,体现了多态性
JDK7之前:只能定义全局常量和抽象方法
全局常量:public static final
抽象方法:public abstract
interface USB {
public static final int lines = 10;
int plugins = 3; // 可以省略public static final
public abstract void start();
void end(); // 可以省略public abstract
}
class Flash implements USB {
@Override
public void start() {
}
@Override
public void end() {
}
}
JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法,默认方法。
知识点:
① 接口中定义的静态方法,只能通过接口来调用
② 可以通过实现类的对象,调用接口中的默认方法
③ 子类的父类和子类实现的接口中声明了同名同参数的默认方法,则类优先
④ 类实现的多个接口中都声明了同名同参数的默认方法,则实现类必须重写默认方法,不然就会“接口冲突”。
public class InterfaceTest {
public static void main(String[] args) {
SubClass subClass = new SubClass();
Example.method1(); // 通过接口调用静态方法
subClass.method2(); // 通过对象调用默认方法
}
}
interface Example{
// 静态方法
public static void method1() {
}
// 默认方法
public default void method2() {
}
}
class SubClass implements Example{
}
二、调用接口方法的几种形式
class Computer {
public void transferData(USB usb) {
usb.start();
usb.end();
}
}
1、创建接口的非匿名实现类的非匿名对象
Flash flash = new Flash();
computer.transferData(flash);
2、创建接口的非匿名实现类的匿名对象
computer.transferData(new Flash());
3、创建接口的匿名实现类的非匿名对象。类似于抽象类
USB usb = new USB() {
@Override
public void start() {
}
@Override
public void end() {
}
};
computer.transferData(usb);
4、创建接口的匿名实现类的匿名对象
computer.transferData(new USB(){
@Override
public void start() {
}
@Override
public void end() {
}
});