Java 8 ещё раз о перегрузке методов

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 обобщения».
Предыдущая статья — «Java 8 автоупаковка и распаковка».

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

Посмотрите на следующий код:

Вопрос: что будет выведено в консоли?

Правильный ответ: 1

Выбор перегруженного метода происходит по следующим правилам:

  1. Выбирается наиболее подходящий метод. Если бы у нас был метод, принимающий short x , то он бы и выполнился. Если нужно, то может выполняться расширяющее преобразование примитивов. Выбирается метод, для которого нужно наиболее близкое расширяющее преобразование. В данном случае до int , так как long , float  и double «большие» типы.
  2. Расширяющее преобразование примитивов имеет приоритет над автоупаковкой/распаковкой.
  3. Автоупаковка/распаковка имеет приоритет перед методом с переменным количеством аргументов.
  4. Сужающее преобразование примитивов автоматически НЕ выполняется.

Если бы в примере выше метода method1(int x) не было, то выполнился бы метод method1(long x) .

А вот в при таком коде:

Выполнится метод method1(Short x).

 

Следующий пример:

Этот код выведет в консоль:

Так как переменная obj  имеет тип Monster . Фактически, конечно, obj  ссылается на экземпляр Hobgoblin , но выбор перегруженного метода осуществляется на этапе компиляции, а не на этапе выполнения, поэтому метод выбирается на основе типа объявленной переменной.

Но если переписать так:

То в консоль выведется число 2, так как теперь переменная obj  имеет тип Hobgoblin, и наиболее подходящим методом будет method1(Goblin obj)

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 обобщения».
Предыдущая статья — «Java 8 автоупаковка и распаковка».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *