一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是Java不支持多重继承。有了接口,就可以得到多重继承的效果。
另一方面,有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,仅仅是具有相同的行为特征而已。例如:摄像头、充电器、MP3、手机、数码相机、移动硬盘等都支持USB连接。
接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须能…”的思想。继承是一个“是不是”的关系,而接口实现的是“能不能”的关系。
但因为接口无法实例化,所以讲接口的特点其实就是在将实现类的特点。
注意
JDK7及以前:只能定义全局常量和抽象方法
全局常量:public static final的,但书写时可以省略不写。
抽象方法:public、abstract
JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法、默认方法。
接口中不能定义构造器,也就意味着接口是不可实例化的。
Java开发中,接口通过让类去实现(implements)的方法来使用,如果实现类覆盖了接口中所有的抽象方法,则此实现类就可以实例化。如果此实现类没有覆盖接口中所有的抽象方法,则此实现类仍为抽象类。
Java类可以实现多个接口,弥补了Java单继承的局限性。
格式:class A extends B implements c,d,e
接口与接口之间可以继承,而且可以多继承。
Code
0x1 实现单个接口
public class Main {public static void main(String[] args) {System.out.println(Flyable.MAX_SPEED);System.out.println(Flyable.MIN_SPEED);System.out.println(Flyable.test);//Flyable.test = 1; //Cannot assign a value to final variable 'test'Plane p = new Plane();p.fly();p.stop();Kite k = new Kite();k.fly();k.stop();}}//可以飞 这样的一个功能interface Flyable {//全局常量public static final int MAX_SPEED = 7900;//第一宇宙速度public static final int MIN_SPEED = 1;int test = 0;// 省略了public static final//抽象方法public abstract void fly();void stop();//省略了public abstract}class Plane implements Flyable {@Overridepublic void fly() {System.out.println("飞机通过引擎起飞");}@Overridepublic void stop() {System.out.println("飞机驾驶员减速停止");}}class Kite implements Flyable {@Overridepublic void fly() {System.out.println("风筝通过风力起飞");}@Overridepublic void stop() {System.out.println("没有风了,风筝掉了下来");}}
0x2 实现多个接口
public class Main {public static void main(String[] args) {Bullet b = new Bullet();b.fly();b.attack();b.stop();}}//可以飞 这样的一个功能interface Flyable {//全局常量public static final int MAX_SPEED = 7900;//第一宇宙速度public static final int MIN_SPEED = 1;int test = 0;// 省略了public static final//抽象方法public abstract void fly();void stop();//省略了public abstract}interface Attackable {void attack();}class Bullet implements Flyable, Attackable {@Overridepublic void fly() {System.out.println("子弹被枪射出去");}@Overridepublic void stop() {System.out.println("子弹因为地球引力落到地上了");}@Overridepublic void attack() {System.out.println("子弹击中了目标");}}
输出
子弹被枪射出去
子弹击中了目标
子弹因为地球引力落到地上了
