Подскажите/посоветуйте. Зачем нам при создании класса добавлять к нему поля setName, setCourse, если они и так у нас инициализируются через конструктор?
Это называется "инкапсуляция". Когда вы можете обращаться к переменным класса только через методы класса. Это нужно для того, чтобы в дальнейшем можно было без проблем изменить логику установки значений, и весь остальной код не сыпанулся. Например, вы можете проводить валидацию значения и, если значение такое уже встречается, отказывать. Или, например, произошло у заказчика очередное изменение логики, и теперь надо определенное поле увеличивать на какой-то заданный коэффициент. В этом случае вы внесете правки в сеттер, а весь остальной код продолжит по-прежнему плавно работать.