Могут ли нестатические методы перегрузить статические?

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

Возможно ли при переопределении метода изменить: модификатор доступа, возвращаемый тип, тип аргумента или их количество, имена аргументов или их порядок; убирать, добавлять, изменять порядок следования элементов секции throws?

При переопределении метода сужать модификатор доступа не разрешается, т.к. это приведёт к нарушению принципа подстановки Барбары Лисков. Расширение уровня доступа возможно. Можно изменять все, что не мешает компилятору понять какой метод родительского класса имеется в виду:

  • Изменять тип возвращаемого значения при переопределении метода разрешено только в сторону сужения типа (вместо родительского класса — наследника).

  • При изменении типа, количества, порядка следования аргументов вместо переопределения будет происходить

    overloading (перегрузка) метода.

  • Секцию throws метода можно не указывать, но стоит помнить, что она остаётся действительной, если уже определена у метода родительского класса. Также, возможно добавлять новые исключения, являющиеся наследниками от уже объявленных или исключения RuntimeException. Порядок следования таких элементов при переопределении значения не имеет.

Как получить доступ к переопределенным методам родительского класса?

С помощью ключевого слова super мы можем обратиться к любому члену родительского класса — методу или полю, если они не определены с модификатором private.

Можно ли объявить метод абстрактным и статическим одновременно?

Нет. В таком случае компилятор выдаст ошибку: «Illegal combination of modifiers: ‘abstract’ and ‘static’»

. Модификатор abstract говорит, что метод будет реализован в другом классе, а 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 , который содержит один метод экземпляра и один метод класса. Второй класс, подкласс 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 — Как переопределить статические методы в подклассе?

спросил

5 лет, 8 месяцев назад

Изменено 3 года, 4 месяца назад

Просмотрено 3к раз

  1. Для какой версии Java планируется реализовать возможность переопределения статических методов?

  2. В каком году это будет?

  3. Как добиться подобного в Java 8?

  4. Есть ли какой-нибудь хак для Oracle JVM?

  5. Существуют ли другие виртуальные машины или компиляторы, способные переопределять статические методы?

Я вижу, что есть путаница со словом «статический» в java.

Что я действительно ищу, так это методов класса (это не имеет значения, если вы называете их «статический метод», «метод класса» или что-то еще..)

  • Java
  • класс
  • наследование
  • статическое
  • переопределение

6

Вот и весь смысл, почему многие люди считают static отклонением от нормы для хорошего ООП: он убивает полиморфизм (помимо того, что вводит тесную связь между вашими классами).

Таким образом, простой ответ таков: переопределяющий и статический несовместимы. Не с версиями Java до 8 или 9; и, скорее всего: также никогда в будущем — я не знаю каких-либо планов/проектов/JCP, чтобы изменить это.

В этом смысле единственный ответ: просто не используйте его.

Если вообще, вы помещаете его в небольшие вспомогательные методы, которые являются «автономными» (то есть они выполняют некоторые простые функциональные действия, которые отлично работают в вашей среде модульного тестирования). Как только static

встанет у вас на пути к легкому модульному тестированию кода, вы пойдете по ложному пути.

Когда найдешь static в унаследованном коде, с которым вам приходится иметь дело, — тогда рассмотрите возможность определения интерфейса для базовой функциональности, чтобы вы могли отделить свой код от фактических статических методов.

5

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Документация JDK 20 — Главная