interface关键字使抽象的概念更向前迈进了一步。abstract关键字允许人们在类中创建一个或多个没有任何定义的方法——提供了接口部分,但是没有提供任何相应的具体实现,这些实现是由此类的继承者创建的。interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体实现。它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。接口只提供了形式,而未提供任何具体实现。
接口也可以包含域,但是这些域隐式地是staticfinal的。

java中的多重继承

接口不仅仅只是一种更纯粹形式的抽象类,它的目标比这要高。因为接口是根本没有任何具体实现的——也就是说,没有任何与接口相关的存储;因此,也就无法阻止多个接口的组合。

下面的例子展示了一个具体类组合数个接口之后产生了一个新类:

  1. //: interfaces/Adventure.java
  2. // Multiple interfaces.
  3. interface CanFight {
  4. void fight();
  5. }
  6. interface CanSwim {
  7. void swim();
  8. }
  9. interface CanFly {
  10. void fly();
  11. }
  12. class ActionCharacter {
  13. public void fight() {}
  14. }
  15. class Hero extends ActionCharacter
  16. implements CanFight, CanSwim, CanFly {
  17. public void swim() {}
  18. public void fly() {}
  19. }
  20. public class Adventure {
  21. public static void t(CanFight x) { x.fight(); }
  22. public static void u(CanSwim x) { x.swim(); }
  23. public static void v(CanFly x) { x.fly(); }
  24. public static void w(ActionCharacter x) { x.fight(); }
  25. public static void main(String[] args) {
  26. Hero h = new Hero();
  27. t(h); // Treat it as a CanFight
  28. u(h); // Treat it as a CanSwim
  29. v(h); // Treat it as a CanFly
  30. w(h); // Treat it as an ActionCharacter
  31. }
  32. } ///:~

Adventure类中,可以看到有四个方法把上述各种接口和具体类作为参数。当Hero对象被创建时,它可以被传递给这些方法中的任何一个,这意味着它依次被向上转型为每一个接口。

这个例子所展示的就是使用接口的核心原因:为了能够向上转型为多个基类型(以及由此而带来的灵活性)。
使用接口的第二个原因与使用抽象基类相同:防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。

我们可以在任何现有类之上添加新的接口,所有这意味着让方法接受接口类型,是一种让任何类都可以对该方法进行适配的方式。这就是使用接口而不是类的强大之处。

菜鸟教程-接口