Функция doIt напечатает "папа". Есть ли способ заставить ее печатать "сын"?
Переведено автоматически
Ответ 1
Короче говоря, нет, нет способа переопределить переменную класса.
Вы не переопределяете переменные класса в Java, вы их скрываете. Переопределение относится к методам экземпляра. Скрытие отличается от переопределения.
В приведенном вами примере, объявляя переменную класса с именем 'me' в class Son, вы скрываете переменную класса, которую она унаследовала бы от своего отца-суперкласса с тем же именем 'me'. Скрытие переменной таким образом не влияет на значение переменной класса 'me' в суперклассе Dad.
Что касается второй части вашего вопроса о том, как заставить его печатать "son", я бы установил значение через конструктор. Хотя приведенный ниже код довольно сильно отличается от вашего первоначального вопроса, я бы написал его примерно так;
ДА. Но что касается переменной, то она перезаписывается (присваивается новое значение переменной. Переопределяется новое определение функции). Просто не объявляйте переменную, а инициализируйте (измените) в конструкторе или статическом блоке.
Значение будет отражено при использовании в блоках родительского класса
если переменная статическая, то измените значение во время самой инициализации с помощью static block,
classSonextendsDad { static { me = "son"; } }
или же изменить в конструкторе.
Вы также можете изменить значение позже в любых блоках. Это будет отражено в суперклассе
Вы можете создать средство получения, а затем переопределить это средство получения. Это особенно полезно, если переопределяемая вами переменная сама по себе является подклассом. Представьте, что в вашем суперклассе есть Object член, но в вашем подклассе это теперь более точно определено как Integer.