Выдает ошибку при попытке переопределить toString()
Не могу понять почему выдает ошибку при попытке переопределить toString(). Цель переопределить в родительском и наследуемом классе.
package cs520.hw2.part2;
public class OnlineCourse extends Course{
private int technologyFee;
public OnlineCourse(String name, int cost, int number, int fee)
{
super(name, cost, number);
technologyFee = fee;
}
public String toString()
{
return (super.toString() +
"\n TechnologyFee = $" + getTechnologyFee());
}
public void setTechnologyFee(int fee)
{
technologyFee = fee;
}
public int getTechnologyFee()
{
return technologyFee;
}
int totaltechnologyFee;
public int getTotalTuition()
{
totaltechnologyFee = getTotalTuition() + technologyFee;
return totaltechnologyFee;
}
public String toString()
{
return ("Course: " + getName() +
" @ $" + getTotalTuition());
}
}
Ответы (2 шт):
Автор решения: Алексей Шиманский
→ Ссылка
Скорее всего ошибка о переполнении стэка. Потому что из метода toString вызывается метод getTotalTuition, а тот, в свою очередь обращается сам к себе. В итоге он рекурсивно вызывает себя бесконечно и стэк переполняется.
Автор решения: Ilya Lisov
→ Ссылка
В Вашем также примере есть несколько ошибочных вещей:
int totaltechnologyFee;
public int getTotalTuition()
{
totaltechnologyFee = getTotalTuition() + technologyFee;
return totaltechnologyFee;
}
- Вы вызываете метод getTotalTuition() из самого себя - это бесконечная рекурсия. Возможно Вы хотите обратиться к родительскому методу
getTotalTuition(), тогда следует вызывать это какsuper.getTotalTuition(). - Используйте аннотации
@Override. Это сделать переопределение более наглядным, а Ваш код более качественным. - У вас не может быть два метода с одинаковой сигнатурой в одном классе. В данном случае речь идет про метод
toString() - Если Вы используете локальную переменную, то создавайте ее локально. Не нужно создавать переменную
totaltechnologyFeeвне метода, если она не будет вызвана нигде кроме этого самого метода.