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

Вообще-то... ответ - НЕТ, если Вы размышляете с той точки зрения, что поведение переопределенного метода изменится. Вы не получите ошибок компиляции при попытке переопределения статического метода. Это значит, что если Вы попытаетесь переопределить, компилятор не остановит Вас; но также, Вы не получите желаемого результата в той степени, в которой достигается он при переопределении не статических методов. Вообще, переопределение в Java означает, что определенный метод будет вызван на основании типа объекта во время выполнения, а не на типе объекта, существующего во время компиляции (что и происходит в случае переопределения статических методов). Давайте подумаем почему статическое переопределение ведет себя так странно? Потому что статические методы являются методам классов и доступ к ним разрешен во время компиляции только с использованием типа данных при компиляции.
Доступ к этим методам с использованием объектных ссылок - всего лишь дополнительная свобода, данная разработчикам Java.
Пример. Давайте посмотрим, что произойдет, если мы попытаемся переопределить статический метод в классе:
Результатом выполнения данного кода будет:
Взгляните на вторую строку вывода. Если бы staticMethod был переопределен, эта строка была бы идентична третьей строке, поскольку мы бы вызывали метод staticMethod() на объектом времени выполнения с типом SubClass, а не SuperClass. Это подтверждает тот факт, что статические методы всегда вызываются на основе информации времени компиляции.
Материалы, которые могут вас заинтересовать
- Вопрос: Восходящее преобразование и generic
- Играем в компилятор.
- Аргументы методов в Java : pass-by-value or pass-by-reference
- Все о String.intern()
- Java. Как создать объект обобщенного типа? How is a generic type instantiated?
- Java. Что такое параметризированный или обобщенный тип? / What is a parameterized or generic type?
- Java. Что такое дженерики? / What is Java Generics?
- Java. Замена символов в строке / Replacing characters in string
- Java. Как получить путь к проекту? / How to get project path?







На самом деле статический метод нельзя переопределить (override) или перегрузить (overload), но его можно.. не знаю как это по русски)), но по буржуйски это звучит как redefine:
static methods can be only redefined!
override - переопределить
overload - перегрузить
redefine - пересмотреть???
Тут рассмотрен частный случай override.
В итоге выяснили, что производя override над static методом, получим нечто другое :)
Кстати, данный вопрос рассматривается в книге SCJP Sun® Certified Programmer for Java™ 6 Study Guide Exam.
Поддерживаю. Отличная книга. Всегда при мне. Сколько бы не перечитывал, а всегда останутся нюансы, которых не знаю. Как по мне, может заменить любое пособие по Core Java. Рассмотрено все до мелочей.
Ага, теперь ясно… А то я не сразу поняла где тут связь с названием…
Отправить комментарий