×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

为什么java没有实现class的多继承

这个问题有点老生常谈了,但是看到坛子里面有人给出了误导的说法还有人认为是good points,就来正一正视听罢,正好今天比较闲。

假设A有两个subclass B和C,D又同时是B和C的subclass,这是最简单的多继承例子。当B和C中有重名的method,那在D中继承的是哪个呢?这个问题就叫diamond problem,因为4个class和4个继承关系组成的图形如钻石。

diamond problem不是不可解决,有些语言比如C++是支持多继承的。但是,多继承带来的麻烦比好处要大,Java的设计者们的本意是要设计一个简单的语言,所以他们放弃了对class多继承的支持,而用没有implementation的interface来实现多继承。

OK,如果你在面试中被问到这样的问题,你可以说“是为了避免钻石问题”,可千万不要说是因为内存管理方面的原因...

如果对diamond problem有进一步的兴趣请自行google,小弟就不负责任了。不过sun对多继承的说明不太好找,我再奉送一个link:http://java.sun.com/docs/white/langenv/ 这篇白皮书如果没有读过还是可以用来消磨下马桶上的时光的。
Report

Replies, comments and Discussions:

  • 工作学习 / 专业知识杂谈 / 为什么java没有实现class的多继承
    这个问题有点老生常谈了,但是看到坛子里面有人给出了误导的说法还有人认为是good points,就来正一正视听罢,正好今天比较闲。

    假设A有两个subclass B和C,D又同时是B和C的subclass,这是最简单的多继承例子。当B和C中有重名的method,那在D中继承的是哪个呢?这个问题就叫diamond problem,因为4个class和4个继承关系组成的图形如钻石。

    diamond problem不是不可解决,有些语言比如C++是支持多继承的。但是,多继承带来的麻烦比好处要大,Java的设计者们的本意是要设计一个简单的语言,所以他们放弃了对class多继承的支持,而用没有implementation的interface来实现多继承。

    OK,如果你在面试中被问到这样的问题,你可以说“是为了避免钻石问题”,可千万不要说是因为内存管理方面的原因...

    如果对diamond problem有进一步的兴趣请自行google,小弟就不负责任了。不过sun对多继承的说明不太好找,我再奉送一个link:http://java.sun.com/docs/white/langenv/ 这篇白皮书如果没有读过还是可以用来消磨下马桶上的时光的。
    • 因为冬眠的熊要醒了
    • Thanks. I like this kind of post.
    • 马桶上看这种书要得ZC的!
    • 用Interface 来实现多重继承。Java 有时候过于拖裤子放屁了,有2本书,一个叫Lighter,Faster Java 另一个叫 Beyond Java, 都很好.都是Oreilly的。
      Java的复杂性的确保证了许多人的饭碗,不过的确很没必要的复杂。
      Java的工作越来越工匠化,现在是框架层出不穷。数的上的Java Framework 就20多,光XML库就10个有多。
      所谓时髦的Dependency injection and reverse 和 Aspect programming 都其实是啥?
      除了它能赚钱的复杂性外,对本质的解决问题的方法上实际是蔽大于利的。
      • 这两本书你都真的看了吗?一本书里面狠狠地夸了AOP,另一本书也介绍了Inversion of Control和Dependency injection。你夸这两本书却又不知道AOP和IoC怎么回事,真是奇怪
        • 不要钻牛角尖
          看你的口气就是好为人师的吧。暂且不谈Beyond Java 里对Ruby 的偏执,但是扁AOP的篇幅就不少
          说回来,我觉得在大部分Java应用的领域 - 一个Web Interface + DB backend的环境,如同书中所说,Java都不是很好的选择
          技术这种东西太钻牛角尖没好处。比如当年流行的 Borland OWL, M$ MFC, Dephi, VB6 哪个不是有自己一大队“框架”。
          我是从Logo语言玩起的,不幸的是这些框架都学过,甚至Borland的文本Control 框架也搞过,为了达到当年VGA文本上显示Norton图形鼠标,我还自己写了个框架
          回头看看,这些技术不是不好,只是更新的太快,很快就都没用了。
          现在火的RoR, PyGTK,Groovy, 过几年估计也那样了。
          实际上API都是皮毛,算法才是真的。很多大型软件至今还是C写的就证明了这点。

          话说回来,Java不搞的难点,要是跟PHP似的,谁给你发高薪啊。
          • You are good.
          • 人啊,还是不要去褒贬自己不懂的东西为好。
      • mark java
      • That's the attraction of Java -- an extendable open framework. Take AOP for example, if you like it, you can use it. If you don't like it, then don't use it. (Personally I don't like the idea of AOP.)