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()
,或直到你的内存不足,从而导致堆栈溢出错误。