【问题标题】:“every class in java extends the MetaClass Object” does it imply that every subclass causes a Diamond issue“java 中的每个类都扩展了 MetaClass 对象”是否意味着每个子类都会导致 Diamond 问题
【发布时间】:2014-04-05 13:40:08
【问题描述】:

java中的这两个事实

事实 1

java中的每个类默认扩展java元类Object

事实 2

java中不允许多重继承”在这里阅读更多关于钻石问题Java inheritance

很困惑

假设ClassB 扩展ClassA 然后根据事实1 ClassB 扩展Object

这是否意味着ClassB 扩展了ClassAObject?是多重继承的情况吗?

如果不是多重继承,那这两种说法怎么不矛盾?

【问题讨论】:

  • 将其作为 QA 知识共享
  • 用示例更新答案
  • 事实上,“默认”是这个概念的关键。

标签: java inheritance fact


【解决方案1】:

“java中的每个类默认扩展java元类Object” //事实1

每个类都扩展Object 类,仅当它们不直接扩展任何其他类时

如果一个类Test扩展了另一个Sample类,那么Test不直接扩展Object类,而是通过超类Sample继承Object类行为,直接扩展Object类。

【讨论】:

    【解决方案2】:

    感谢您提供事实的来源。现在我可以说一些细节了。

    “Head First Java 2nd edition”在第 208 页说:

    Java 中的每个类都扩展了 Object

    类对象是所有类的母亲;它是 everything 的超类。

    在该段的更下方,它说:

    您编写的每个类都扩展了 Object, 您无需说出来。 [...]可以把它想象成您编写的类看起来像这样:public class Dogextends Object{ } [...] Dog 已经扩展什么,。 [...] 编译器将使 Canine 改为扩展 Object。

    虽然他们试图进行通信的一般想法(Java 中的每个类都有 java.lang.Object 作为 a 超类)是正确的,但他们使用了错误的术语,并且示例使用了 @ 987654327@ 是完全错误的,这会导致您感到困惑。

    我已经编写了一个 Java 编译器(用于 Java 1.4)并且我对 Java 语言规范非常熟悉,所以请耐心等待。

    为了证明术语“Head First Java”是错误的,我需要引用 Java 语言规范,这有点技术性。

    但首先我可以给你一个更简单的解释,你是如何看到这个的。

    更好的定义

    Java 中没有明确extend 另一个类的每个类都扩展Object

    当你写作时:

    class Canine { } 
    

    然后编译器将其理解为:

    class Canine extends Object { }
    

    但是当你写的时候:

    class Dog extends Canine { }
    

    然后编译器会看到你已经显式扩展了一个类,并且 不会改变代码的含义。

    由于 Head First Java 第二版基于 Java 5,我将使用该版本 Java 的 Java 语言规范。

    extends的含义定义在section 8.1.4 of the JLS

    8.1.4 超类和子类

    普通类声明中的可选扩展子句指定 当前类的直接超类

    Super:
      extends ClassType
    

    如您所见,extends 仅指 direct 超类。在 Head First Java 的示例中,Dog 没有扩展 Object,因为它的直接超类是 Canine。只有 Canine 扩展了 Object。

    他们的意思是 Object 是 Java 中所有其他类的超类。这在 JLS section 4.3.2 中定义:

    4.3.2 类对象

    Object 类是所有其他类的超类(第 8.1 节)。一种 Object 类型的变量可以保存对 null 引用的引用 或任何对象,无论是类的实例还是数组 (§10)。所有类和数组类型都继承类的方法 Object,[...]

    恐怕您被 Head First Java 第 2 版中的误导方式所误导。 希望已经在较新的版本中修复了这个问题(如果有人有,请确认/反驳),否则我们应该通知作者。

    【讨论】:

    • 请参考 Head First Java 第 2 版,(第 208 页)。
    • 它用粗体写成“Java 中的每个类都扩展了类对象”。而“编译器将使 Canine 扩展 Object”这一行
    • 您引用了“Java 中的每个类都有对象作为祖先,但说 Java 中的每个类都扩展对象是不正确的。”。请指出任何可以帮助我更好地理解它的文档或参考资料。
    • @veer7 感谢您提供对事实来源的参考。我已经完全更新了我的答案,并指出了 Head First Java 的错误之处,以及更好的查看方式。
    【解决方案3】:

    是的,这两种说法都是正确的。

    确实,java中的每个类都扩展了元类Object

    ClassB 仍然没有多重继承,因为在编译时 java 将 Object 类移动了一级。

    这种方式现在 ClassA 现在扩展 Object 而不是 ClassB

    这种方式ClassB 没有多重继承,所以遵循fact2。

    现在ClassB 扩展ClassAClassA 扩展Object 从而通过MultiLEVEL 继承 ClassB 扩展Object; fact1 紧随其后

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多