В Java поля не переопределены, они скрыты. Это означает, что Increase.a
и SubIncrease.a
являются отдельными полями, которые могут быть изменены и запрошены отдельно. Поскольку тип переменной f
равен Increase
, выражение f.a
возвращает значение поля суперкласса. Но метод add()
переопределен , а f.add()
вызывает метод подкласса, который изменяет поле подкласса.
Скрытие поля редко имеет смысл, поэтому вам следует избегать его. Если вы хотите иметь поле с другим значением по умолчанию в подклассе, определите его только в суперклассе и присвойте ему значение в конструкторе подкласса.