Object类是每个类的基类,即每个类都扩展Object类。 Object类中有一个公共的String toString()方法,并且String类中也存在相同的方法。 现在,String类还扩展了Object类,方法toString返回String类型。
我的问题是:在编译Object类时,它将搜索String.class,String类将搜索Object.class,从而创建一种相互依赖性。如何解决这种依赖?编译机制如何工作?如果我错了,请纠正我。
答案 0 :(得分:4)
Java编译器是Multi-Pass Compiler。这意味着编译过程中有增量步骤。在编译Object
时,它使用String
的临时表示,以便允许Object
进行编译。
您可以将临时表示与某种隐藏界面进行比较。编译器编译到该接口。只有在运行时,编译的部分才会聚集在一起 - 编译器不需要一个完全编译的类来编译另一个类,只需要它的抽象。
答案 1 :(得分:2)
实际上,当你写这样的代码时:
public class Class1
{
public Class2 giveClass2()
{
return new Class2();
}
}
public class Class2 : Class1 { }
它正确编译,因为它没有实例化任何东西。编译器只检查您使用的类型是否已定义。
但是,如果你按如下方式编写:
public class Class1
{
public Class1(){
aClass2 = new Class2();
}
public Class2 aClass2;
}
public class Class2 : Class1
{
}
这也将被编译,但它会在运行时导致堆栈溢出,因为循环依赖会影响。