Stackoverflow错误

下面给出的代码显示了运行时的Stackoverflow错误。但是如果我创建另一个类CarChange来创建Car的对象,它运行成功。 我是初学者,用这段代码来理解java中upcasting的重要性。

public class Car { int i; Car[] c=new Car[2]; Car() { c[0] = new Polo(); i=0; } void drive(){ c[i].testdrive(); //the overloaded method in subclasses polo and swift } void change() { if(i==0) { i++; c[i] = new Swift(); } } public void testdrive() { //overloaded method in subclasses polo and swift System.out.println(" test drive car"); } //class Tester { //main Car c= new Car(); c.drive(); c.change(); c.drive(); 

stackoverflow通常意味着你有一个无限循环。

你收到这个的原因是因为你从testdrive方法调用驱动器,并且在那种方法中你再次调用驱动器。

 Car() { c[0] = new Polo(); i=0; } 

由于Polo是Car()的子类 – 它必须适合Car [] – 它将在构造时调用Car的构造函数。 Car构造函数尝试创建一个新的Polo()

由于Polo是Car()的子类 – 它必须适合Car [] – 它将在构造时调用Car的构造函数。 Car构造函数尝试创建一个新的Polo()

由于Polo是Car()的子类 – 它必须适合Car [] – 它将在构造时调用Car的构造函数。 Car构造函数尝试创建一个新的Polo()

你明白了吗?

听起来你可能会发生一些无限递归。

drive()调用testdrive()哪个class drive()永远调用testdriver() ,或直到你的内存不足,从而导致堆栈溢出错误。