这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
5.2.1、状态、实现和类型的多重继承
类和接口之间最大的区别就是类可以声明字段,但接口却不能声明字段。而且,你可以通过实例化类来创建对象,但接口却不能。对象通过在类中定义的字段来存储它的状态。Java编程语言不支持多重继承的一个原因就是避免状态的多重继承带来的问题。比如:假设你能够扩展多个类来创建一个子类。当你实例化该类来获得其对象时,该对象将继承父类的所有字段。对于同一个字段的实例化到底应该用哪个父类的方法或者构造器呢?哪个方法或者构造器优先调用?然而对于接口来说由于它没有字段,所以你就不需要担心对象状态的多重继承产生的各种问题。
Implementation的多重继承 是从多个类中继承它们方法定义的一种能力。这种类型的多重继承会遇到一些问题,比如名称冲突和歧义。支持多重继承的编译器在遇到父类中出现多个同名的方法,它很难确定应该访问或者调用哪个成员或者方法。而且,程序员向父类中添加方法可能会无意间引入一些名称冲突。默认方法 引入了一种Implementation多重继承的方法。类可以实现多个接口,这也包括同名的默认方法。Java编译器提供一种规则来决定哪个类的默认方法将会被使用。
Java支持类型多重继承,这是指类可以实现多个接口。一个对象可以有多种类型:它自身的类型和它实现的所有接口的类型。这意味着如果一个变量声明成一个接口的类型,该变量可以被赋值为所有实现了该接口的类的实例化对象。
与Implementation的多重继承 一样,类可以继承其扩展的接口中定义方法的不同实现(默认或静态)。在这种情况下,编译器或用户必须决定使用哪一个。