Могут ли нестатические методы перегрузить статические?
Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Возможно ли при переопределении метода изменить: модификатор доступа, возвращаемый тип, тип аргумента или их количество, имена аргументов или их порядок; убирать, добавлять, изменять порядок следования элементов секции throws?
При переопределении метода сужать модификатор доступа не разрешается, т.к. это приведёт к нарушению принципа подстановки Барбары Лисков. Расширение уровня доступа возможно. Можно изменять все, что не мешает компилятору понять какой метод родительского класса имеется в виду:
Изменять тип возвращаемого значения при переопределении метода разрешено только в сторону сужения типа (вместо родительского класса — наследника).
При изменении типа, количества, порядка следования аргументов вместо переопределения будет происходить
Секцию throws метода можно не указывать, но стоит помнить, что она остаётся действительной, если уже определена у метода родительского класса. Также, возможно добавлять новые исключения, являющиеся наследниками от уже объявленных или исключения RuntimeException. Порядок следования таких элементов при переопределении значения не имеет.
Как получить доступ к переопределенным методам родительского класса?
С помощью ключевого слова super мы можем обратиться к любому члену родительского класса — методу или полю, если они не определены с модификатором private.
Можно ли объявить метод абстрактным и статическим одновременно?
Нет. В таком случае компилятор выдаст ошибку: «Illegal combination of modifiers: ‘abstract’ and ‘static’»
В чем разница между членом экземпляра класса и статическим членом класса?
Модификатор static говорит о том, что данный метод или поле принадлежат самому классу и доступ к ним возможен даже без создания экземпляра класса. Поля, помеченные static инициализируются при инициализации класса. На методы, объявленные как static, накладывается ряд ограничений:
Они могут вызывать только другие статические методы.
Они не могут ссылаться на члены типа this или super.
В отличии от статических, поля экземпляра класса принадлежат конкретному объекту и могут иметь разные значения для каждого. Вызов метода экземпляра возможен только после предварительного создания объекта класса.
Где разрешена инициализация статических/нестатических полей?
Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.
Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.
статический метод переопределения в Java
Хотите выучить основы метода?
В Java метод экземпляра в подклассе с той же сигнатурой и типом возврата, что и у метода экземпляра в суперклассе, переопределяет метод суперкласса.
Переопределение и сокрытие методов
Возможность подкласса переопределять метод позволяет классу наследовать от суперкласса, чье поведение close enough
а затем изменить поведение по мере необходимости. Переопределенный метод имеет то же имя, число и тип параметров, и тип возвращаемого значения, что и метод, который он переопределяет. По сути, это определение метода, скрывающегося в Java.
Переопределяющий метод также может возвращать подтип типа, возвращаемого переопределенным методом. Это называется covariant return
тип.
При переопределении метода, вы можете использовать @Override
аннотация, которая указывает компилятору, что вы намереваетесь переопределить метод в суперклассе. Если по какой-то причине компилятор обнаружит, что метод не существует ни в одном из суперклассов, он выдаст ошибку.
Если подкласс определяет метод класса с той же сигнатурой, что и метод класса в суперклассе, метод в подклассе hides
тот в суперклассе.
Различие между hiding and overriding
имеет важные последствия. Версия переопределенного метода, который вызывается, является той из подкласса. Версия вызываемого скрытого метода зависит от того, вызывается ли он из суперкласса или из подкласса .
Можем ли мы переопределить статический метод в Java?
No, you cannot override static method in Java
потому что переопределение метода основано на динамическом связывании во время выполнения. Обычно статические методы связываются с использованием статического связывания во время компиляции еще до запуска программы.
В принципе, keyword static
изменяет жизненный цикл переменной и метода. Если вы указываете статический метод или переменную, то они создаются во время загрузки класса, а не во время выполнения. Nonstatic
переменные и методы доступны только во время выполнения.
Давайте посмотрим на ниже пример Java, который содержит два класса. Первый
, который содержит один метод экземпляра и один метод класса. Второй класс, подкласс Company
, называется CrunchifyComapny
:
Пожалуйста, взгляните на встроенные описания комментариев для получения дополнительной информации.
CrunchifyHideStaticMethod.java
Джава
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | пакет ком . crunchify. учебные пособия ; / ** * @author Crunchify.com * / общественности учебный класс CrunchifyHideStaticMethod { общественности статический недействительным главная ( Строка args [ ] ) { Компания CMP знак равно новый CrunchifyCompany ( ) ; // если мы можем переопределить static, это должно вызвать метод из класса Child CMP. staticMethod ( ) ; // Eclipse должен показывать предупреждение: статический метод // staticMethod () из типа Company должно быть // доступ статический CMP. nonStaticMethod ( ) ; } } // Comapny: Super-Parent Class учебный класс Компания { // открытый статический метод, который не может быть переопределен в Java общественности статический недействительным staticMethod ( ) { Система. вне. println ( «Компания: метод статического экземпляра» ) ; } // нестатический метод общественности недействительным nonStaticMethod ( ) { Система. вне. println ( «Компания: нестатический метод» ) ; } } // CrunchifyCompany: дочерний класс учебный класс CrunchifyCompany продолжается Компания { / * * статический метод с тем же именем и сигнатурой метода, который существовал в супер * класс, это не переопределение метода, это называется скрытием метода * на Java * / общественности статический недействительным staticMethod ( ) { Система. эээ. println ( «CrunchifyCompany: переопределенный метод статического экземпляра» ) ; } // нестатический метод общественности недействительным nonStaticMethod ( ) { Система. вне. println ( CrunchifyCompany: нестатический метод ) ; } } |
Выход консоли Eclipse:
Компания : статический Метод экземпляра CrunchifyCompany : не — Статическая метод |
Скрытие и переопределение метода Java: статический метод переопределения в Java
0.00 (0%) 0 votes
Предыдущая статьяКак перебрать список Java? Пять (5) способов пройти через цикл в Java
Следующая статьяЧто такое партнерский маркетинг — 11 общих правил и руководство для начинающих зарабатывать деньги
ЕЩЁ БОЛЬШЕ НОВОСТЕЙ
java — Как переопределить статические методы в подклассе?
спросил
Изменено 3 года, 4 месяца назад
Просмотрено 3к раз
Для какой версии Java планируется реализовать возможность переопределения статических методов?
В каком году это будет?
Как добиться подобного в Java 8?
Есть ли какой-нибудь хак для Oracle JVM?
Существуют ли другие виртуальные машины или компиляторы, способные переопределять статические методы?
Я вижу, что есть путаница со словом «статический» в java.
- Java
- класс
- наследование
- статическое
- переопределение
6
Вот и весь смысл, почему многие люди считают static отклонением от нормы для хорошего ООП: он убивает полиморфизм (помимо того, что вводит тесную связь между вашими классами).
Таким образом, простой ответ таков: переопределяющий и статический несовместимы. Не с версиями Java до 8 или 9; и, скорее всего: также никогда в будущем — я не знаю каких-либо планов/проектов/JCP, чтобы изменить это.
В этом смысле единственный ответ: просто не используйте его.
Если вообще, вы помещаете его в небольшие вспомогательные методы, которые являются «автономными» (то есть они выполняют некоторые простые функциональные действия, которые отлично работают в вашей среде модульного тестирования). Как только static
Когда найдешь static в унаследованном коде, с которым вам приходится иметь дело, — тогда рассмотрите возможность определения интерфейса для базовой функциональности, чтобы вы могли отделить свой код от фактических статических методов.
5
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается