Интерфейсы, перечисления и классы обертки. Лекция 4

Содержание

Слайд 2

План Отношения между классами Приведение ссылочных типов Перечисления Оболочки типов Автоупаковка Перегрузка с дополнительными факторами

План

Отношения между классами
Приведение ссылочных типов
Перечисления
Оболочки типов
Автоупаковка
Перегрузка с дополнительными факторами

Слайд 3

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

Отношения между классами

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

разделе рассмотрим какие бывают отношения между классами в Java.
Слайд 4

Отношения между классами IS-A отношения В ООП принцип IS-A основан на

Отношения между классами

IS-A отношения
В ООП принцип IS-A основан на наследовании классов

или реализации интерфейсов. Например, если класс HeavyBox наследует Box, мы говорим, что HeavyBox является Box (HeavyBox IS-A Box). Или другой пример - класс Lorry расширяет класс Car. В этом случае Lorry IS-A Car.
Тоже самое относится и к реализации интерфейсов. Если класс Transport реализует интерфейс Moveable, то они находятся в отношении Transport IS-A Moveable.
Слайд 5

Отношения между классами HAS-A отношения HAS-A отношения основаны на использовании. Выделяют

Отношения между классами

HAS-A отношения
HAS-A отношения основаны на использовании. Выделяют три варианта

отношения HAS-A: ассоциация, агрегация и композиция.
Слайд 6

Отношения между классами Начнем с ассоциации. В этих отношениях объекты двух

Отношения между классами

Начнем с ассоциации. В этих отношениях объекты двух классов

могут ссылаться друг на друга. Например, класс Horse HAS-A Halter если код в классе Horse содержит ссылку на экземпляр класса Halter:
Слайд 7

Отношения между классами Агрегация и композиция являются частными случаями ассоциации. Агрегация

Отношения между классами

Агрегация и композиция являются частными случаями ассоциации. Агрегация -

отношение когда один объект является частью другого. А композиция - еще более тесная связь, когда объект не только является частью другого объекта, но и вообще не может принадлежат другому объекту. Разница будет понятна при рассмотрении реализации этих отношений.
Слайд 8

Отношения между классами Агрегация Объект класса Halter создается извне Horse и

Отношения между классами

Агрегация
Объект класса Halter создается извне Horse и передается в

конструктор для установления связи. Если объект класса Horse будет удален, объект класса Halter может и дальше использоваться, если, конечно, на него останется ссылка:
Слайд 9

Отношения между классами Композиция Теперь посмотрим на реализацию композиции. Объект класса

Отношения между классами

Композиция
Теперь посмотрим на реализацию композиции. Объект класса Halter создается

в конструкторе, что означает более тесную связь между объектами. Объект класса Halter не может существовать без создавшего его объекта Horse:
Слайд 10

Приведение ссылочных типов В предыдущих уроках мы рассматривали преобразование примитивных типов.

Приведение ссылочных типов

В предыдущих уроках мы рассматривали преобразование примитивных типов. В

этом разделе рассмотрим какие существуют варианты приведения ссылочных типов в языке Java. В общем выделяют два варианта - это сужение и расширение.
Слайд 11

Приведение ссылочных типов Расширение типов в Java Первый вариант приведения -

Приведение ссылочных типов

Расширение типов в Java
Первый вариант приведения - это расширение.

Расширение означает переход от более конкретного типа к менее конкретному, то есть переход от детей к родителям.
Слайд 12

Приведение ссылочных типов Подобно случаю с примитивными типами, этот переход производится

Приведение ссылочных типов

Подобно случаю с примитивными типами, этот переход производится самой

JVM при необходимости и незаметен для разработчика. Если класс Box суперкласс, а HeavyBox - его наследник, то объект типа HeavyBox можно неявно преобразовать к Box:
Также расширяющим являются преобразованием от null-типа к любому объектному типу:
Слайд 13

Приведение ссылочных типов Сужение типов в Java Обратный переход, то есть

Приведение ссылочных типов

Сужение типов в Java
Обратный переход, то есть движение по

дереву наследования вниз, к наследникам, является сужением. Объект box типа Box приводим к HeavyBox:
Слайд 14

Приведение ссылочных типов Следующий пример показывает зачем нужны сужающие преобразования. Допустим

Приведение ссылочных типов

Следующий пример показывает зачем нужны сужающие преобразования.
Допустим переменная box1

типа Box6 указывает на объект типа HeavyBox1 (Box6 - это суперкласс, HeavyBox1 - его наследник). Мы хотим вывести на консоль значение переменной класса weight для объекта box1. Но переменная weight объявлена в классе HeavyBox1, поэтому доступа к ней через box1 мы не имеем. Для того чтобы обратиться к весу, нам необходимо сделать приведение к HeavyBox1: HeavyBox1 heavyBox1 = (HeavyBox1) box1.
Слайд 15

Приведение ссылочных типов При попытке приведения переменной box2, указывающей на объект

Приведение ссылочных типов

При попытке приведения переменной box2, указывающей на объект типа

ColorBox, к HeavyBox1, возникнет ошибка ClassCastException времени выполнения. ColorBox тоже является наследником класса Box6, поэтому ошибки компиляции не возникнет.
Слайд 16

Приведение ссылочных типов instanceof keyword - это двоичный оператор, используемый для

Приведение ссылочных типов

instanceof keyword - это двоичный оператор, используемый для проверки,

является ли объект (экземпляр) подтипом данного типа.
Слайд 17

Приведение ссылочных типов Представьте объект dog, созданный с помощью Object dog = new Dog(), а затем:

Приведение ссылочных типов

Представьте объект dog, созданный с помощью Object dog =

new Dog(), а затем:
Слайд 18

Приведение ссылочных типов Однако, с Object animal = new Animal(); потому

Приведение ссылочных типов

Однако, с Object animal = new Animal();
потому что Animal

является супертипом dog и, возможно, менее "уточненным".
Будет false. Это связано с тем, что dog не является подтипом и не реализует его.
Слайд 19

Приведение ссылочных типов Несовместимые преобразования в Java Преобразования возможны только внутри

Приведение ссылочных типов

Несовместимые преобразования в Java
Преобразования возможны только внутри одной иерархии.
Данный

пример не cкомпилируется:
Слайд 20

Приведение ссылочных типов Переходы между массивами и примитивными типами являются запрещенными:

Приведение ссылочных типов

Переходы между массивами и примитивными типами являются запрещенными:

Слайд 21

Приведение ссылочных типов Массив, основанный на примитивном типе, принципиально нельзя преобразовать

Приведение ссылочных типов

Массив, основанный на примитивном типе, принципиально нельзя преобразовать к

типу массива, основанному на ссылочном типе, и наоборот:
Слайд 22

Приведение ссылочных типов Преобразования между типами массивов, основанных на различных примитивных типах, невозможно:

Приведение ссылочных типов

Преобразования между типами массивов, основанных на различных примитивных типах,

невозможно:
Слайд 23

Приведение ссылочных типов Массив, основанный на типе HeavyBox, можно привести к

Приведение ссылочных типов

Массив, основанный на типе HeavyBox, можно привести к массиву,

основанному на типе Box, если сам тип HeavyBox приводится к типу Box.
Слайд 24

Перечисления В Java 5 были введены перечисления, которые создаются с использованием

Перечисления

В Java 5 были введены перечисления, которые создаются с использованием ключевого

слова enum. Перечисления указывают возможные значения для какого-то явления. Например, вы открыли кофейню, в которой продаются три возможные варианты кофе - BIG, HUGE и OVERWHELMING. Других вариантов быть не может. Если задавать значения с помощью String, можно выбрать любое другое значение, например - MIDDLE, SMALL. Задавая перечисления, вы ограничиваете возможные варианты:
Слайд 25

Перечисления В простейшей форме перечисления - это список именованных констант. Каждая

Перечисления

В простейшей форме перечисления - это список именованных констант. Каждая константа

перечисления (BIG, HUGE и OVERWHELMING) является объектом класса, в котором она определена. Константы перечисления являются static final и не могут быть изменены после создания.
Перечисления можно представить в виде класса, содержащего константы, например:
Слайд 26

Перечисления Но у перечислений гораздо больше преимуществ по сравнению с таким

Перечисления

Но у перечислений гораздо больше преимуществ по сравнению с таким классом.

Какие - рассмотрим чуть позже.
Можно создавать переменные типа перечисления. При этом не используется оператор new. Переменная перечисления объявляется и применяется практически так же, как и переменные примитивных типов:
Слайд 27

Перечисления Значения перечислимого типа можно также использовать в управляющем операторе switch.

Перечисления

Значения перечислимого типа можно также использовать в управляющем операторе switch. В

выражениях ветвей case должны использоваться константы из того же самого перечисления, что и в самом операторе switch. В выражениях ветвей case имена констант указываются без уточнения имени их перечислимого типа. Тип перечисления в операторе switch уже неявно задает тип enum для операторов case.
Слайд 28

Перечисления Перечисление в Java относится к типу класса, но перечисление НЕ

Перечисления

Перечисление в Java относится к типу класса, но перечисление НЕ может

наследоваться от другого класса и НЕ может быть суперклассом.
Все перечисления автоматически наследуют от класса java.lang.Enum. В этом классе определяется ряд методов, доступных для использования во всех перечислениях: ordinal(), compareTo(), equals(), values() и valueOf().
Перечисления также неявно наследуют интерфейсы Serializable и Comparable.
Рассмотрим методы класса java.lang.Enum.
Слайд 29

Перечисления Метод values() возвращает массив, содержащий список констант перечислимого типа:

Перечисления

Метод values() возвращает массив, содержащий список констант перечислимого типа:

Слайд 30

Перечисления Результат выполнения:

Перечисления

Результат выполнения:

Слайд 31

Перечисления Статический метод valueOf() возвращает константу перечислимого типа, значение которой соответствует

Перечисления

Статический метод valueOf() возвращает константу перечислимого типа, значение которой соответствует символьной

строке, переданной в качестве аргумента. Можно сказать, что этот метод преобразует значение String в перечисление:
Слайд 32

Перечисления Вызвав метод ordinal(), можно получить значение, которое обозначает позицию константы

Перечисления

Вызвав метод ordinal(), можно получить значение, которое обозначает позицию константы в

списке констант перечислимого типа. Порядковые значения начинаются с нуля:
Слайд 33

Перечисления С помощью метода int compareTo(типПеречисления e) можно сравнить порядковые значения

Перечисления

С помощью метода int compareTo(типПеречисления e) можно сравнить порядковые значения двух

констант одного и того же перечислимого типа. Метод возвращает значение типа int.
Если порядковое значение вызывающей константы меньше, чем у константы е (this < e), то метод compareTo() возвращает отрицательное значение.
Если порядковые значения обеих констант одинаковы (this == e), возвращается нуль.
Если порядковое значение вызывающей константы больше, чем у константы е (this > e), то возвращается положительное значение.
Слайд 34

Перечисления Результат:

Перечисления

Результат:

Слайд 35

Перечисления Вызвав метод equals(), переопределяющий аналогичный метод из класса Object, можно

Перечисления

Вызвав метод equals(), переопределяющий аналогичный метод из класса Object, можно сравнить

на равенство константу перечисления с любым другим объектом. Но оба эти объекта будут равны только в том случае, если они ссылаются на одну и ту же константу из одного и того же перечисления. Простое совпадение порядковых значений не вынудит метод equals() возвратить логическое значение true, если две константы относятся к разным перечислениям.
Слайд 36

Перечисления При сравнении констант перечислений, можно использовать оператор "==" - он

Перечисления

При сравнении констант перечислений, можно использовать оператор "==" - он будет

работать также, как и метод equals().
Слайд 37

Перечисления Создать экземпляр перечисления с помощью оператора new нельзя, но в

Перечисления

Создать экземпляр перечисления с помощью оператора new нельзя, но в остальном

перечисление обладает всеми возможностями, которые имеются у других классов. А именно - в перечисления можно добавлять конструкторы, переменные и методы. Конструкторы перечисления являются private по умолчанию.
Допустим мы хотим задать размер нашей чашки кофе в миллилитрах. Для этого введем переменную ml в перечисление и геттер метод getMl(). Добавим конструктор, на вход которого будем задавать значение для миллилитров.
Обратите внимание, что при объявлении конструктора не указан модификатор доступа - он private по умолчанию. Уже говорилось, что нельзя создавать объекты перечисления используя оператор new. Как же тогда вызвать наш конструктор? Для вызова конструктора перечисления после указания константы ставятся круглые скобки, в которых передается нужное значение.
Слайд 38

Перечисления

Перечисления

Слайд 39

Перечисления Методы для перечисления вызываются так же, как и для обычного

Перечисления

Методы для перечисления вызываются так же, как и для обычного объекта.

В следующем классе мы перебираем все константы нашего перечисления и для каждого вызываем метод getMl():
Слайд 40

Перечисления Конструкторы в перечислении могут быть перегружены, как показано в следующем

Перечисления

Конструкторы в перечислении могут быть перегружены, как показано в следующем примере.

Для вызова конструктора без параметров просто не пишите скобки после константы:
Слайд 41

Перечисления Перечисления могут быть объявлены: отдельным классом или как член класса.

Перечисления

Перечисления могут быть объявлены: отдельным классом или как член класса. Но

НЕ могут быть объявлены внутри метода.
В этом пример перечисление CoffeeSize объявлено внутри класса Coffee3:
Слайд 42

Перечисления Для обращения к такому перечислению необходимо использовать имя внешнего класс:

Перечисления

Для обращения к такому перечислению необходимо использовать имя внешнего класс:

Слайд 43

Перечисления Перечисления могут быть объявлены: отдельным классом или как член класса.

Перечисления

Перечисления могут быть объявлены: отдельным классом или как член класса. Но

НЕ могут быть объявлены внутри метода.
В этом пример перечисление CoffeeSize объявлено внутри класса Coffee3:
Слайд 44

Перечисления Для перечислений можно переопределять методы, но это не совсем обычное

Перечисления

Для перечислений можно переопределять методы, но это не совсем обычное переопределение.
Добавим

в наше перечисление метод getLid(), который возвращает код крышки для чашки кофе. Для всех констант подходит код B, который возвращает этот метод, кроме константы OVERWHELMING. Для OVERWHELMING чашки нужен код A. Переопределим метод getLid() для этой константы. Как это делается? После объявления константы открываем фигурные скобки, в которых и переопределяем этот метод. Если необходимо переопределить несколько методов, это делается в этих же фигурных скобках.
Слайд 45

Перечисления

Перечисления

Слайд 46

Перечисления Перечисления не могут наследовать другие классы, но могут реализовывать интерфейсы.

Перечисления

Перечисления не могут наследовать другие классы, но могут реализовывать интерфейсы. Например,

следующее перечисление реализует интерфейс Runnable:
Слайд 47

Оболочки типов Очень часто необходимо создать класс, основное назначение которого содержать

Оболочки типов

Очень часто необходимо создать класс, основное назначение которого содержать в

себе какое-то примитивное значение. Например, как мы увидим в следующих занятиях, обобщенные классы и в частности коллекции работают только с объектами. Поэтому, чтобы каждый разработчик не изобретал велосипед, в Java SE уже добавлены такие классы, которые называются оболочки типов (или классы обертки, Wrappers).
Слайд 48

Оболочки типов К оболочкам типов относятся классы Double, Float, Long, Integer,

Оболочки типов

К оболочкам типов относятся классы Double, Float, Long, Integer, Short,

Byte, Character, Boolean, Void. Для каждого примитивного значения и ключевого слова void есть свой класс-двойник. Имя класса, как вы видите, совпадает с именем примитивного значения. Исключения составляют класс Integer (примитивный тип int) и класс Character (примитивный тип char). Кроме содержания в себе значения, классы оболочки предоставляют обширный ряд методов, которые мы рассмотрим в этом уроке.
Объекты классов оболочек неизменяемые (immutable). Это значит, что объект не может быть изменен.
Все классы-обертки числовых типов имеют переопределенный метод equals(Object), сравнивающий примитивные значения объектов.
Слайд 49

Оболочки типов В следующей таблицы для каждого класса оболочки указан соответствующий

Оболочки типов

В следующей таблицы для каждого класса оболочки указан соответствующий примитивный

тип и варианты конструкторов. Как вы видите каждый класс имеет два конструктора: один на вход принимает значение соответствующего примитивного значения, а второй - значение типа String. Исключения: класс Character, у которого только один конструктор с аргументом char и класс Float, объявляющий три конструктора - для значения float, String и еще double.
Слайд 50

Оболочки типов

Оболочки типов

Слайд 51

Оболочки типов Рассмотрим варианты вызова конструкторов на примере. Чтобы создать объект

Оболочки типов

Рассмотрим варианты вызова конструкторов на примере. Чтобы создать объект класса

Integer, передаем в конструктор либо значение типа int либо String.
Слайд 52

Оболочки типов Если передаваемая в конструктор строка не содержит числового значения,

Оболочки типов

Если передаваемая в конструктор строка не содержит числового значения, то

выбросится исключение NumberFormatException.
При вызове конструктора с аргументом String класса Boolean, не обязательно передавать строки true или false. Если аргумент содержит любую другую строку, просто будет создан объект, содержащий значение false. Исключение выброшено не будет:
Слайд 53

Оболочки типов Как уже было сказано, классы оболочки содержат обширный ряд

Оболочки типов

Как уже было сказано, классы оболочки содержат обширный ряд методов.

Рассмотрим их.
Метод valueOf() предоставляет второй способ создания объектов оболочек. Метод перегруженный, для каждого класса существует два варианта - один принимает на вход значение соответствующего типа, а второй - значение типа String. Так же как и с конструкторами, передаваемая строка должна содержать числовое значение. Исключение составляет опять же класс Character - в нем объявлен только один метод, принимающий на вход значение char.
Слайд 54

Оболочки типов И в целочисленные классы Byte, Short, Integer, Long добавлен

Оболочки типов

И в целочисленные классы Byte, Short, Integer, Long добавлен еще

один метод, в который можно передать строку, содержащую число в любой системе исчисления. Вторым параметром вы указываете саму систему исчисления.
В следующем примере показано использование всех трех вариантов для создания объектов класса Integer:
Слайд 55

Оболочки типов Методы parseXxx() В каждом классе оболочке содержатся методы, позволяющие

Оболочки типов

Методы parseXxx()
В каждом классе оболочке содержатся методы, позволяющие преобразовывать строку

в соответствующее примитивное значение. В классе Double - это метод parseDouble(), в классе Long - parseLong() и так далее. Разница с методом valueOf() состоит в том, что метод valueOf() возвращает объект, а parseXxx() - примитивное значение.
Слайд 56

Оболочки типов Также в целочисленные классы Byte, Short, Integer, Long добавлен

Оболочки типов

Также в целочисленные классы Byte, Short, Integer, Long добавлен метод,

в который можно передать строку, содержащую число в любой системе исчисления. Вторым параметром вы указываете саму систему исчисления. Следующий пример показывает использование метода parseLong():
Слайд 57

Оболочки типов Все типы-оболочки переопределяют toString(). Этот метод возвращает читабельную для

Оболочки типов

Все типы-оболочки переопределяют toString(). Этот метод возвращает читабельную для человека

форму значения, содержащегося в оболочке. Это позволяет выводить значение, передавая объект оболочки типа методу println():
Также все числовые оболочки типов предоставляют статический метод toString(), на вход которого передается примитивное значение. Метод возвращает значение String:
Integer и Long предоставляют третий вариант toString() метода, позволяющий представить число в любой системе исчисления. Он статический, первый аргумент – примитивный тип, второй - основание системы счисления:
Слайд 58

Оболочки типов Integer и Long позволяют преобразовывать числа из десятичной системы

Оболочки типов

Integer и Long позволяют преобразовывать числа из десятичной системы исчисления

к шестнадцатеричной, восьмеричной и двоичной. Например:
Слайд 59

Оболочки типов Все оболочки числовых типов наследуют абстрактный класс Number. Number

Оболочки типов

Все оболочки числовых типов наследуют абстрактный класс Number. Number объявляет

методы, которые возвращают значение объекта в каждом из различных числовых форматов.
Слайд 60

Оболочки типов Пример приведения типов

Оболочки типов

Пример приведения типов

Слайд 61

Оболочки типов Каждый класс оболочка содержит статические константы, содержащие максимальное и

Оболочки типов

Каждый класс оболочка содержит статические константы, содержащие максимальное и минимальное

значения для данного типа.
Например в классе Integer есть константы Integer.MIN_VALUE – минимальное int значение и Integer.MAX_VALUE – максимальное int значение.
Классы-обертки числовых типов Float и Double, помимо описанного для целочисленных примитивных типов, дополнительно содержат определения следующих констант:
NEGATIVE_INFINITY – отрицательная бесконечность;
POSITIVE_INFINITY – положительная бесконечность;
NaN – не числовое значение (расшифровывается как Not a Number).
Слайд 62

Оболочки типов Следующий пример демонстрирует использование трех последних переменных. При делении

Оболочки типов

Следующий пример демонстрирует использование трех последних переменных. При делении на

ноль возникает ошибка - на ноль делить нельзя. Чтобы этого не происходило, и ввели переменные NEGATIVE_INFINITY и POSITIVE_INFINITY. Результат умножения бесконечности на ноль - это значение NaN:
Слайд 63

Автоупаковка Автоупаковка и распаковка это процесс преобразования примитивных типов в объектные

Автоупаковка

Автоупаковка и распаковка это процесс преобразования примитивных типов в объектные и

наоборот. Весь процесс выполняется автоматически средой выполнения Java (JRE).
Слайд 64

Автоупаковка Автоупаковка происходит при прямом присвоении примитива классу-обертке (с помощью оператора

Автоупаковка

Автоупаковка происходит при прямом присвоении примитива классу-обертке (с помощью оператора "="),

либо при передаче примитива в параметры метода.
Распаковка происходит при прямом присвоении классу-обертке примитива.
Компилятор использует метод valueOf() для упаковки, а методы intValue(), doubleValue() и так далее, для распаковки.
Слайд 65

Автоупаковка Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива

Автоупаковка

Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива —

типу «класса-обертки».
Например, попытка автоупаковать переменную типа byte в Short, без предварительного явного приведения byte->short вызовет ошибку компиляции:
Слайд 66

Автоупаковка Автоупаковку можно использовать при вызове метода:

Автоупаковка

Автоупаковку можно использовать при вызове метода:

Слайд 67

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

Автоупаковка

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

упаковывается заново:
Слайд 68

Автоупаковка C появлением автоупаковки/распаковки стало возможным применять объекты Boolean для управления

Автоупаковка

C появлением автоупаковки/распаковки стало возможным применять объекты Boolean для управления в

операторе if и других циклических конструкциях Java:
Слайд 69

Автоупаковка До Java 5 работа с классами обертками была более трудоемкой:

Автоупаковка

До Java 5 работа с классами обертками была более трудоемкой:

Слайд 70

Автоупаковка Перепишет тот же пример для работы с классами начиная с Java 5:

Автоупаковка

Перепишет тот же пример для работы с классами начиная с Java

5:
Слайд 71

Автоупаковка ВАЖНО! Объекты классов оболочек неизменяемые (immutable):

Автоупаковка

ВАЖНО! Объекты классов оболочек неизменяемые (immutable):

Слайд 72

Автоупаковка Рассмотрим следующий пример: Переменная y указывает на объект в памяти:

Автоупаковка

Рассмотрим следующий пример:
Переменная y указывает на объект в памяти:

Слайд 73

Автоупаковка Если мы попытаемся изменить y, у нас создастся еще один

Автоупаковка

Если мы попытаемся изменить y, у нас создастся еще один объект

в памяти, на который теперь и будет указывать y:
Переменная y указывает на объект в памяти:
Слайд 74

Автоупаковка Кэширование объектов классов оболочек Метод valueOf() не всегда создает новый

Автоупаковка

Кэширование объектов классов оболочек
Метод valueOf() не всегда создает новый объект. Он

кэширует следующие значения:
Boolean,
Byte,
Character от\u0000 до \u007f (7f это 127),
Short и Integer от-128 до 127.
Если передаваемое значение выходит за эти пределы, то новый объект создается, а если нет, то нет.
Если мы пишем new Integer(), то гарантированно создается новый объект.
Слайд 75

Автоупаковка Рассмотрим это на следующем примере:

Автоупаковка

Рассмотрим это на следующем примере:

Слайд 76

Перегрузка с дополнительными факторами Перегрузка методов усложняется при одновременном использовании следующих

Перегрузка с дополнительными факторами

Перегрузка методов усложняется при одновременном использовании следующих факторов:
расширение
автоупаковка/распаковка
аргументы

переменной длины
Слайд 77

Перегрузка с дополнительными факторами При расширение примитивных типов используется наименьший возможный вариант из всех методов.

Перегрузка с дополнительными факторами

При расширение примитивных типов используется наименьший возможный вариант

из всех методов.
Слайд 78

Перегрузка с дополнительными факторами Расширение и boxing Между расширением примитивных типов

Перегрузка с дополнительными факторами

Расширение и boxing
Между расширением примитивных типов и boxing

всегда выигрывает расширение. Исторически это более старый вид преобразования.
Слайд 79

Перегрузка с дополнительными факторами Упаковка и расширение Можно упаковать, а потом

Перегрузка с дополнительными факторами

Упаковка и расширение
Можно упаковать, а потом расширить. Значение

типа int может стать Object, через преобразование Integer.
Слайд 80

Перегрузка с дополнительными факторами Расширение и упаковка Нельзя расширить и упаковать.

Перегрузка с дополнительными факторами

Расширение и упаковка
Нельзя расширить и упаковать. Значение типа

byte не может стать Long. Нельзя расширить от одного класса обертки к другой. (IS-A не работает.)
Слайд 81

Перегрузка с дополнительными факторами Между расширением примитивных типов и var-args всегда проигрывает var-args:

Перегрузка с дополнительными факторами

Между расширением примитивных типов и var-args всегда проигрывает

var-args:
Слайд 82

Перегрузка с дополнительными факторами Упаковка и var-args совместимы с перегрузкой методов. Var-args всегда проигрывает:

Перегрузка с дополнительными факторами

Упаковка и var-args совместимы с перегрузкой методов. Var-args

всегда проигрывает: