Выдает ошибку при попытке переопределить 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;
}
  1. Вы вызываете метод getTotalTuition() из самого себя - это бесконечная рекурсия. Возможно Вы хотите обратиться к родительскому методу getTotalTuition(), тогда следует вызывать это как super.getTotalTuition().
  2. Используйте аннотации @Override. Это сделать переопределение более наглядным, а Ваш код более качественным.
  3. У вас не может быть два метода с одинаковой сигнатурой в одном классе. В данном случае речь идет про метод toString()
  4. Если Вы используете локальную переменную, то создавайте ее локально. Не нужно создавать переменную totaltechnologyFee вне метода, если она не будет вызвана нигде кроме этого самого метода.
→ Ссылка