4.8 权衡
在接口中定义方法的诸多变化引发了一系列问题,既然可用代码主体定义方法,那Java 8中的接口还是旧有版本中界定的代码吗?现在的接口提供了某种形式上的多重继承功能,然而多重继承在以前饱受诟病,Java因此舍弃了该语言特性,这也正是Java在易用性方面优于C++的原因之一。
语言特性的利弊也在不断演化。很多人认为多重继承的问题在于对象状态的继承,而不是代码块的继承,默认方法避免了状态的继承,也因此避免了C++中多重继承的最大缺点。
突破语言上的局限性吸引着无数优秀的程序员不断尝试。现在已有一些博客文章,阐述在Java 8中实现完全的多重继承做出的尝试,包括状态的继承和默认方法。尝试突破Java 8这些有意为之的语言限制时,却往往又掉进C++的旧有陷阱之中。
接口和抽象类之间还是存在明显的区别。接口允许多重继承,却没有成员变量;抽象类可以继承成员变量,却不能多重继承。在对问题域建模时,需要根据具体情况进行权衡,而在以前的Java中可能并不需要这样。
