下面给出的代码显示了运行时的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();
答案 0 :(得分:4)
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()。
...你明白了吗?
答案 1 :(得分:2)
stackoverflow通常意味着你有一个无限循环。
您收到此消息的原因是您正在使用testdrive方法调用驱动器,并且在该方法中,您再次调用驱动器。
答案 2 :(得分:2)
听起来你可能会发生一些无限的递归。
drive()
调用testdrive()
class drive()
永久地调用testdriver()
,或直到内存不足,从而导致堆栈溢出错误。