在阅读Java中的多重继承或钻石问题时,我意识到它不受支持。但我想知道Java如何实际限制多重继承?
是否有任何类可以检查程序员是否在extends关键字之后传递了多个类名或其他方法来检测此功能?
我阅读了一些文章,但没有任何关于Java如何防止多重继承的建议,除了它抛出错误的一个常见答案:classname继承了多个类。
答案 0 :(得分:3)
但我想知道Java如何实际限制多重继承?
在语法级别禁止使用它。类声明的语法允许extends
关键字后面的一个类名。 implements
列表中的名称必须是接口名称而不是类名称。请参阅JLS的Section 8.1 Class Declarations。编译器会检查这两件事。尝试声明多个超类的Java源代码将无法编译。
在实施层面," .class"的格式file只允许将一个类列为super_class
;请参阅JVM规范的Section 4.1中的ClassFile
结构。 interfaces
中的标识符都必须引用接口。 JVM规范中指定的各种类文件约束由JVM的本机类加载器强制实施。
如果您想查看如何强制执行这些限制,您可以下载OpenJDK源代码树并自行阅读代码。 (我不明白这一点。你真正需要知道的是,这些限制是严格执行的,没有切实可行的办法来解决这个问题。)
答案 1 :(得分:2)
如果您尝试扩展多个类,编译器实际上会抱怨,并声明error: '{' expected
。如果您对JDK的哪些部分真正感兴趣,我建议您查看OpenJDK sources。可以找到javac
解析器的源代码here。
作为旁注,Java不允许多重继承状态,这就是你所指的。但是,您仍然可以通过实现多个接口来实现多重行为继承。