Core Java. Можно ли переопределять статические методы?

max аватар
85
Находится в разделах:

Вообще-то... ответ - НЕТ, если Вы размышляете с той точки зрения, что поведение переопределенного метода изменится. Вы не получите ошибок компиляции при попытке переопределения статического метода. Это значит, что если Вы попытаетесь переопределить, компилятор не остановит Вас; но также, Вы не получите желаемого результата в той степени, в которой достигается он при переопределении не статических методов. Вообще, переопределение в Java означает, что определенный метод будет вызван на основании типа объекта во время выполнения, а не на типе объекта, существующего во время компиляции (что и происходит в случае переопределения статических методов). Давайте подумаем почему статическое переопределение ведет себя так странно? Потому что статические методы являются методам классов и доступ к ним разрешен во время компиляции только с использованием типа данных при компиляции. 

Доступ к этим методам с использованием объектных ссылок - всего лишь дополнительная свобода, данная разработчикам Java. 

Пример. Давайте посмотрим, что произойдет, если мы попытаемся переопределить статический метод в классе:

Результатом выполнения данного кода будет:

Взгляните на вторую строку вывода. Если бы staticMethod был переопределен, эта строка была бы идентична третьей строке, поскольку мы бы вызывали метод staticMethod() на объектом времени выполнения с типом SubClass, а не SuperClass. Это подтверждает тот факт, что статические методы всегда вызываются на основе информации времени компиляции.


Конец
Константин Дмитриевич Ушинский утверждает, что воля наша, как и наши мускулы, крепнет от постоянно усиливающейся деятельности; не давая им упражнения, вы непременно будете иметь слабые мускулы и слабую волю.

На самом деле статический метод нельзя переопределить (override) или перегрузить (overload), но его можно.. не знаю как это по русски)), но по буржуйски это звучит как redefine:

static methods can be only redefined!


override - переопределить
overload - перегрузить
redefine - пересмотреть???

max аватар

Тут рассмотрен частный случай override. 

В итоге выяснили, что производя override над static методом, получим нечто другое :)

Кстати, данный вопрос рассматривается в книге SCJP Sun® Certified Programmer for Java™ 6 Study Guide Exam.

max аватар

Поддерживаю. Отличная книга. Всегда при мне. Сколько бы не перечитывал, а всегда останутся нюансы, которых не знаю. Как по мне, может заменить любое пособие по Core Java. Рассмотрено все до мелочей.

Ага, теперь ясно… А то я не сразу поняла где тут связь с названием…

override - переопределить overload - перегрузить redefine - пересмотреть??? Перевод слова "override" как "переопределить" не совсем удачен. Лучше бы "override" переводить как "переназначить", тогда "redifine" вполне логично переводилось бы "переопределить".

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке