接口

使用关键字interface 定义,是和类同级别的结构
实例:模拟USB的接口逻辑
面试题:区分抽象类和接口

内部结构

可以声明:
属性:必须使用public static final修饰(可以省略)
方法:
jdk8之前:声明抽象方法,修饰为public abstract (可以省略)
jdk8:声明静态方法、默认方法
jdk9:声明私有方法

interface Flyable{  //接口
    //全局常量
    public static final int MIN_SPEED = 0;
    //可以省略public static final
    int MAX_SPEED = 7900;
    //方法可以省略public abstract 声明
    void fly();
}

使用规则

类实现接口

class A extends SuperA implements B,C{}

A是SuperA的子类,是B和C的实现类,表现为单继承和多实现,一定程度上就弥补了类的单继承的局限性

和其他结构的联系

类和接口

类必须将实现的接口中的所有的抽象方法都重写(或实现),方可实例化。否则,此实现类必须声明为抽象类

接口和接口

继承关系,且可以多继承

interface AA{
    void method1();
}
interface BB{
    void method2();
}
interface CC extends AA,BB{ //接口可以多继承

}
class DD implements CC{
    @Override
    public void method1() {
    }
    @Override
    public void method2() {
    }
}

接口的多态性

public class InterfaceTest {
    public static void main(String[] args) {
        //接口的多态性
        Flyable f1 = new Bullet();
        f1.fly();
    }
}
interface Flyable{  //接口
    //全局常量
    public static final int MIN_SPEED = 0;
    //可以省略public static final
    int MAX_SPEED = 7900;
    //方法可以省略public abstract 声明
    void fly();
}
interface Attackable{ //接口
    public abstract void  attack();
}
class Bullet implements Flyable,Attackable{// 多实现
    @Override
    public void fly() {
        System.out.println("让子弹飞一会儿");
    }
    @Override
    public void attack() {
        System.out.println("子弹可以击穿身体");
    }
}

创建接口的实现类

除了创建对象实现接口和使用匿名对象实现接口外,匿名类也可以实现接口

Computer computer =  new Computer();
// 创建接口实现类的对象
Printer printer = new Printer();
computer.transferData(printer);

// 创建接口实现类的匿名对象
computer.transferData(new Camera());

// 创建接口匿名实现类的对象
USB usb1 = new USB(){
	public void start(){
		System.out.println("U盘开始工作");
	}
	public void stop(){
		System.out.println("U盘结束工作");
	}
};
computer.transferData(usb1);

接口没有构造器,所以需要在声明的后面实现接口中规定的方法
进一步,可以创建匿名接口的匿名对象

// 创建接口匿名实现类的匿名对象
computer.transferData(new USB() {
	public void start() {
		System.out.println("U盘开始工作");
	}
	public void stop() {
		System.out.println("U盘结束工作");
	}
});

JDK8之后的新特性

jdk8:声明静态方法、默认方法
jdk9:声明私有方法
定义接口NCA

public interface NCA {
    public static void fun1(){
        System.out.println("fun1");
    }
    public default void fun2(){
        System.out.println("fun2");
    }
    public default void fun3(){
        System.out.println("fun3");
    }
}

定义接口NCB

public interface NCB {
    public default void fun3(){
        System.out.println("fun3");
    }
}

实现类SubClass

public class SubClass implements NCA, NCB {
    @Override
    public void fun2() {
        System.out.println("fun2-SubClass");
    }
    @Override
    public void fun3() {
        System.out.println("fun3-SubClass");
    }
    public void fun4() {
        System.out.println("fun4-SubClass");
    }
    public void fun() {
        fun3();
        NCA.super.fun3();
        NCB.super.fun3();
    }
}
NCA.fun1();
SubClass s1 = new SubClass();
s1.fun2();
@Override
public void fun3(){
	System.out.println("fun3-SubClass");
}
NCA.super.fun3();
NCB.super.fun3();