💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## [接口创建](https://lingcoder.gitee.io/onjava8/#/book/10-Interfaces?id=%e6%8e%a5%e5%8f%a3%e5%88%9b%e5%bb%ba) 使用**interface**关键字创建接口。在本书中,interface 和 class 一样随处常见,除非特指关键字**interface**,其他情况下都采用正常字体书写 interface。 描述 Java 8 之前的接口更加容易,因为它们只允许抽象方法。像下面这样: ~~~ // interfaces/PureInterface.java // Interface only looked like this before Java 8 public interface PureInterface { int m1(); void m2(); double m3(); } ~~~ 我们甚至不用为方法加上**abstract**关键字,因为方法在接口中。Java 知道这些方法不能有方法体(仍然可以为方法加上**abstract**关键字,但是看起来像是不明白接口,徒增难堪罢了)。 因此,在 Java 8之前我们可以这么说:**interface**关键字产生一个完全抽象的类,没有提供任何实现。我们只能描述类应该像什么,做什么,但不能描述怎么做,即只能决定方法名、参数列表和返回类型,但是无法确定方法体。接口只提供形式,通常来说没有实现,尽管在某些受限制的情况下可以有实现。 一个接口表示:所有实现了该接口的类看起来都像这样。因此,任何使用某特定接口的代码都知道可以调用该接口的哪些方法,而且仅需知道这些。所以,接口被用来建立类之间的协议。(一些面向对象编程语言中,使用 protocol 关键字完成相同的功能。) Java 8 中接口稍微有些变化,因为 Java 8 允许接口包含默认方法和静态方法——基于某些重要原因,看到后面你会理解。接口的基本概念仍然没变,介于类型之上、实现之下。接口与抽象类最明显的区别可能就是使用上的惯用方式。接口的典型使用是代表一个类的类型或一个形容词,如 Runnable 或 Serializable,而抽象类通常是类层次结构的一部分或一件事物的类型,如 String 或 ActionHero。 使用关键字**interface**而不是**class**来创建接口。和类一样,需要在关键字**interface**前加上**public**关键字(但只是在接口名与文件名相同的情况下),否则接口只有包访问权限,只能在接口相同的包下才能使用它。 接口同样可以包含属性,这些属性被隐式指明为**static**和**final**。 使用**implements**关键字使一个类遵循某个特定接口(或一组接口),它表示:接口只是外形,现在我要说明它是如何工作的。除此之外,它看起来像继承。 ~~~ // interfaces/ImplementingAnInterface.java interface Concept { // Package access void idea1(); void idea2(); } class Implementation implements Concept { @Override public void idea1() { System.out.println("idea1"); } @Override public void idea2() { System.out.println("idea2"); } } ~~~ 你可以选择显式地声明接口中的方法为**public**,但是即使你不这么做,它们也是**public**的。所以当实现一个接口时,来自接口中的方法必须被定义为**public**。否则,它们只有包访问权限,这样在继承时,它们的可访问权限就被降低了,这是 Java 编译器所不允许的。