首先编译哪个类,Object
或String
?
Object
需要返回类型为toString
的同一个类,String
扩展Object
类。
答案 0 :(得分:5)
都不是。就像相互依赖的类的任何其他对或循环一样,它们是同时编译的。
答案 1 :(得分:2)
为了编译任何其他类, javac 必须首先访问Object
类的版本,因为其他类是从该类派生的。如果 javac 类路径中没有该类的版本,则 javac 将会(如果可以找到源代码)在运行时编译Object
“编译任何其他类。
同样的规则适用于正在编译的类的任何其他超类。例如,如果编译SubclassX
是SuperclassX
的子类,而SuperclassX.class不在 javac 类路径中, javac 将需要可以编译Superclass.java。
答案 2 :(得分:1)
实现编译器的方法有很多种。但是,基本方法是解析源并构建符号表。然后使用该符号表将源转换为目标代码。
单通道编译器只能使用已遇到的符号。 Pascal
是设计为使用单通道编译器的语言示例。使用单通道编译器实现java
即使不是不可能也是困难的。
然而,大多数语言使用multi pass
编译器,因为单通道编译器的优势不再重要,在这种情况下使用尚未定义的符号变得微不足道,因为假设它们将在以后遇到在解析阶段。
因此,只要同时编译整个java.lang
包,就可以解决交叉依赖性。另一方面,如果你试图单独编译每个类,解析器会抱怨,因为它会到达解析过程的末尾并且有未解析的符号。