【问题标题】:How does Java restricts Multiple inheritance?Java如何限制多重继承?
【发布时间】:2018-04-08 04:58:18
【问题描述】:

在阅读 Java 中的多重继承或菱形问题时,我意识到它不受支持。但是我想知道Java实际上是如何限制多重继承的?

是否有任何类可以检查程序员是否在 extends 关键字之后传递了多个类名或其他方式来检测此功能?

我读了几篇文章,但没有任何关于 Java 究竟如何防止多重继承的建议,除了一个常见的答案是它会引发错误:类名正在继承多个类。

【问题讨论】:

  • 当你在extends.. 之后写超过 1 个类时,不就是这样吗?
  • extends 关键字后面的多个类名是编译时错误。如果你不能编译一个程序,你就不能运行它。这就是 Java 防止多重继承的方式。
  • @user3437460 对此不太确定。阅读理论资料。

标签: java multiple-inheritance


【解决方案1】:

但我想知道Java实际上是如何限制多重继承的?

在语法级别是不允许的。类声明的语法允许在 extends 关键字之后使用一个类名。 implements 列表中的名称必须是接口名称而不是类名称。请参阅 JLS 的Section 8.1 Class Declarations。编译器会检查这两件事。尝试声明多个超类的 Java 源代码将无法编译。

在实现级别,“.class”文件的格式只允许将一个类列为super_class;请参阅 JVM 规范的 Section 4.1 中的 ClassFile 结构。 interfaces 中的标识符必须全部引用接口。 JVM 规范中指定的各种类文件约束由 JVM 的本机类加载器强制执行。


如果您想了解这些限制是如何实施的,您可以下载 OpenJDK 源代码树并自己阅读代码。 (不过我不明白这一点。你真正需要知道的是,这些限制是严格执行的,没有切实可行的方法来绕过这种强制执行。)

【讨论】:

    【解决方案2】:

    如果您尝试扩展多个类,编译器实际上会抱怨并声明error: '{' expected。如果您对 JDK 的哪个部分实际执行此操作感兴趣,我建议您查看 OpenJDK sourcesjavac 解析器的源代码可以在here 找到。

    附带说明,Java 不允许状态的多重继承,这就是您所指的。不过,您仍然可以通过实现多个接口来实现行为的多重继承。

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 2014-03-16
      • 2015-01-23
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多