本教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参阅Java语言变化。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参阅JDK发行说明。
类和接口之间的一个重要区别是类可以有字段,而接口不能。此外,您可以实例化一个类来创建一个对象,而接口不能。正如在什么是对象?部分中所解释的那样,对象将其状态存储在字段中,这些字段在类中定义。Java编程语言不允许您扩展多个类的一个原因是避免了状态的多重继承问题,即从多个类继承字段的能力。例如,假设您能够定义一个扩展多个类的新类。当您通过实例化该类来创建一个对象时,该对象将从所有超类继承字段。如果不同超类的方法或构造函数实例化相同的字段怎么办?哪个方法或构造函数将优先?因为接口不包含字段,所以您不必担心由于多重继承而产生的问题。
多重继承的实现是从多个类继承方法定义的能力。这种类型的多重继承会导致问题,如名称冲突和模糊性。当支持此类型多重继承的编程语言的编译器遇到包含具有相同名称的方法的超类时,它们有时无法确定要访问或调用的成员或方法。此外,程序员可以通过向超类添加新方法无意中引入名称冲突。默认方法引入了一种多重继承实现的形式。一个类可以实现多个接口,这些接口可以包含相同名称的默认方法。Java编译器提供了一些规则来确定一个特定类使用哪个默认方法。
Java编程语言支持多重继承的类型,即一个类可以实现多个接口的能力。一个对象可以有多个类型:它自己类的类型和类实现的所有接口的类型。这意味着如果一个变量声明为接口类型,那么它的值可以引用从实现该接口的任何类实例化的任何对象。这在使用接口作为类型部分中讨论。
与多重继承的实现类似,一个类可以继承在其扩展的接口中定义的方法的不同实现(作为默认方法或静态方法)。在这种情况下,编译器或用户必须决定使用哪一个。