百科问答小站 logo
百科问答小站 font logo



Java 为什么不支持多继承? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

先从Java 8之前说起。要区分“声明多继承”与“实现多继承”。

Java是不允许“实现多继承”,简称不允许“多继承”。但是Java支持“声明多继承”——Java的接口的多继承——一个类可以实现多个接口(“继承”了多个接口上的方法声明),而一个接口可以继承多个接口(同样是“继承”了多个接口上的方法声明)。

接口只允许有方法声明而不允许有实现,因而不会出现像C++那样的实现多继承的决议问题;抽象类可以有方法实现,但要遵循Java类的单继承限制,也避免了实现多继承的问题。这是早期Java为了与C++区分开的一个决定。

至于早期Java为何要做这样的设计取舍,不必猜测,看看高司令老人家自己是怎么说的:

James Gosling on Java, May 1999

Bill Venners:In Java you included multiple inheritance of interface, but left out multiple inheritance of implementation. Were you trying to say anything to designers by making the interface a separate construct? Were you trying to say anything by leaving out multiple inheritance of implementation? How did that come about?

James Gosling: It listened to people from the C++ and Objective-C camps, and I tried to sort out who had the most happy experiences. The Objective-C notion of a pure interface with no implementation seemed to have worked out really well for people. It avoids a lot of the sticky issues such as disambiguation that people get into in C++. It's still kind of messy. It's an area that I don't feel totally happy with.

Bill Venners: In what way?

James Gosling: Another way for doing these things is a technique called delegation. Some ideas in the delegation camp felt good, but I never came up with anything that really worked. I ended up with the interface construct, which felt simple enough to be comprehensible, sophisticated enough to be useful. It also avoided any of the tar pits that the other folks got into.

纯粹是高司令老人家的taste。

然后,从Java 8开始,接口允许为方法提供“默认实现”了——默认方法(default method)。因而实质上Java 8的接口多继承其实也会涉及到实现多继承,并且语言层面有专门规定去解决实现多继承时选择哪个版本的问题——哪个都不选择,而是在发现会继承多个默认方法实现并且没有override时报错,逼使用户显式override可能冲突的方法。

这使得Java 8开始接口可以当作traits来使用,达到实现多继承的目的。

Java 8语言规范的一些相关新规定:

8.4.8. Inheritance, Overriding, and Hiding 9.4. Method Declarations
13.5.6. Interface Method Declarations



  

相关话题

  java程序员的技术更新那么快,为什么每个技术还要读源码,会使用不就好了吗?技术那么多也学不完啊? 
  c# 的 装箱 和 拆箱 成本有多高? 
  各种语言写网络爬虫有什么优点缺点? 
  计算机领域有哪些经典的典故或笑话? 
  如果一门编程语言中不允许对象(或结构体)循环引用,那么用它实现什么功能会比较困难? 
  谁能用通俗的语言解释一下什么是 RPC 框架? 
  为什么自学Python看不进去? 
  面对对象程序设计中return不能多次使用并且switch最好不用的说法是对的吗? 
  有谁是单纯地喜欢编程吗? 
  造轮子厉害是一种什么样的体验? 

前一个讨论
为什么三体人不选择摧毁两个恒星,以获得一个稳定的星系?
下一个讨论
一个人是否理应忠于自己的祖国,即使是纳粹德国?





© 2025-03-24 - tinynew.org. All Rights Reserved.
© 2025-03-24 - tinynew.org. 保留所有权利