一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是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 实现单个接口

  1. public class Main {
  2. public static void main(String[] args) {
  3. System.out.println(Flyable.MAX_SPEED);
  4. System.out.println(Flyable.MIN_SPEED);
  5. System.out.println(Flyable.test);
  6. //Flyable.test = 1; //Cannot assign a value to final variable 'test'
  7. Plane p = new Plane();
  8. p.fly();
  9. p.stop();
  10. Kite k = new Kite();
  11. k.fly();
  12. k.stop();
  13. }
  14. }
  15. //可以飞 这样的一个功能
  16. interface Flyable {
  17. //全局常量
  18. public static final int MAX_SPEED = 7900;//第一宇宙速度
  19. public static final int MIN_SPEED = 1;
  20. int test = 0;// 省略了public static final
  21. //抽象方法
  22. public abstract void fly();
  23. void stop();//省略了public abstract
  24. }
  25. class Plane implements Flyable {
  26. @Override
  27. public void fly() {
  28. System.out.println("飞机通过引擎起飞");
  29. }
  30. @Override
  31. public void stop() {
  32. System.out.println("飞机驾驶员减速停止");
  33. }
  34. }
  35. class Kite implements Flyable {
  36. @Override
  37. public void fly() {
  38. System.out.println("风筝通过风力起飞");
  39. }
  40. @Override
  41. public void stop() {
  42. System.out.println("没有风了,风筝掉了下来");
  43. }
  44. }

0x2 实现多个接口

  1. public class Main {
  2. public static void main(String[] args) {
  3. Bullet b = new Bullet();
  4. b.fly();
  5. b.attack();
  6. b.stop();
  7. }
  8. }
  9. //可以飞 这样的一个功能
  10. interface Flyable {
  11. //全局常量
  12. public static final int MAX_SPEED = 7900;//第一宇宙速度
  13. public static final int MIN_SPEED = 1;
  14. int test = 0;// 省略了public static final
  15. //抽象方法
  16. public abstract void fly();
  17. void stop();//省略了public abstract
  18. }
  19. interface Attackable {
  20. void attack();
  21. }
  22. class Bullet implements Flyable, Attackable {
  23. @Override
  24. public void fly() {
  25. System.out.println("子弹被枪射出去");
  26. }
  27. @Override
  28. public void stop() {
  29. System.out.println("子弹因为地球引力落到地上了");
  30. }
  31. @Override
  32. public void attack() {
  33. System.out.println("子弹击中了目标");
  34. }
  35. }

输出

子弹被枪射出去
子弹击中了目标
子弹因为地球引力落到地上了