Ошибка переполнения стека - PullRequest
1 голос
/ 03 февраля 2012

Приведенный ниже код показывает ошибку Stackoverflow при запуске. Но если я создаю другой класс CarChange для создания объектов Car, он запускается успешно. Я начинающий, делаю этот код, чтобы понять важность апкастинга в Java.

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();

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012
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 () .

... вы получаете картину?

2 голосов
/ 03 февраля 2012

Звучит так, как будто у вас может быть бесконечная рекурсия.

drive() вызывает testdrive(), что class drive(), что вызывает testdriver() ... навсегда или до тех пор, пока не закончится память, следовательно, ошибка переполнения стека.

2 голосов
/ 03 февраля 2012

Переполнение стека обычно означает, что у вас бесконечный цикл.

Причина, по которой вы получаете это, заключается в том, что вы вызываете диск из метода testdrive и в этом методе вы снова вызываете диск.

...