ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.11.2023
Просмотров: 30
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
— один из инструментов для реализации идеи полиморфизма (принципа ООП, о котором мы рассказывали в прошлой лекции). Поэтому главным преимуществом его использования будет та же гибкость, о которой мы говорили ранее. Мы можем выстроить простую и логичную систему классов, каждый из которых будет обладать специфическим поведением , но единым интерфейсом — один метод на всех вместо кучи методов.
Перегрузка методов - это возможность создавать несколько методов с одинаковым названием, но разными параметрами. Не все языки программирования позволяют это делать. Перегрузка методов - это часть такой составляющей ООП, как полиморфизм. (Если Вы не знаете, что такое ООП и полиморфизм - вернитесь к этой статье).
Дело в том, что перегрузка методов выполняет несколько функций:
1. Вы можете создать несколько конструкторов - с одним, двумя параметрами, и вообще без параметров. Программа будет выбирать тот, который подходит под заданные параметры.
2. В первом примере мы говорили о конструкторах. Но то же самое применимо и к обычным методам. Одним из главных плюсов является то, что Вам не нужно запоминать названия кучи методов, выполняющих похожую функцию.
Нативные методы - это методы написанные на других языках (более низкого уровня), таких как С, С++, ассемблер.
Минусы: При обращении к методам native свойства переносимости и безопасности, присущие коду Java, будут утрачены. Практически невозможно использовать методы native в Jаvа-коде, который предназначен для загрузки из Internet или выполнения на удаленных компьютерах сети (примером являются аплеты). Не исключено, что работать с вашим кодом придется системе совершенно другой архитектуры, но если даже это и не так, система может просто запретить выполнение кода, не вызывающего доверия.
Плюсы: закрывает потребности: использование низкоуровневых функций для обращения к аппаратуре( к памяти ) выполнить какие то задачи, которые проще выполнить на низкоуровневом языке
Пример это hashCode(). Используется нативный метод потому что C++ имеет доступ к памяти.
Private - доступ к компоненту предоставляется только методам этого класса
Default - доступ к компоненту из любых классов из этого же пакета
Protected - доступ к компоненту из любых классов этого же пакета и классов наследников
Public - доступ из любого класса и пакета
В java есть ключевое слово – final
Модификатор final может применяться к переменным, параметрам методов, полям и методам класса или самим классам.
Класс не может иметь наследников;
Метод не может быть переопределен в классах наследниках;
Поле не может изменить свое значение после инициализации;
Параметры методов не могут изменять своё значение внутри метода;
Локальные переменные не могут быть изменены после присвоения им значения.
Сегодня поговорим о специальном модификаторе
Следует также отметить, что к абстрактным классам (с ключевым словом abstract), нельзя применить модификатор final, т.к. это взаимоисключающие понятия.
Чтобы создать immutable класс необходимо :
1) Сделать класс final
2) Сделать все поля private
3) Не создавать конструктор по умолчанию и сеттеры для полей
4) В конструкторе с параметрами и геттерах проводить глубокое копирование получаемого/передаваемого объекта.
String - это ссылочный тип, который при создании экземпляра записывает строку в свое поле charов value, которое имеет модификатор доспупа private и модификатор final, то есть объект однажды создается и больше не изменяется
ключевым словом static помечают члены (поля или методы), которые принадлежат классу, а не экземпляру этого класса.
Это означает, что какое бы количество объектов вы не создали, всегда будет создан только один член, доступный для использования всеми экземплярами класса.
Ключевое слово static применимо к переменным, методам, блокам инициализации, импорту и вложенным классам (nested classes).
- может быть перегружен
- не будет. Класс потомок создаст свой статический метод не связанный с родительским классом
Пакеты можно определить как группировку связанных типов (классы, интерфейсы, перечисления и аннотации), предоставляющий защиту доступа и управление пространством имён.
Некоторые из существующих пакетов в Java:
Программисты могут определять их пакеты для связывания групп классов/интерфейсов и т.д. Группировка связанных классов, реализованных вами, является хорошим практическим решением, т.к. программист сможет легко определить, что классы, интерфейсы, перечисления и аннотации связаны.
Так как пакет создаёт новое пространство имён, в нём не будет никаких конфликтов с именами в других пактах. Используя пакеты, легче предоставить управление доступом и легче найти связанные классы.
Создание пакета
Как создать пакет в Java? Во время создания пакета вы должны выбрать ему имя и включить оператор package вместе с этим именем поверх каждого исходного файла, который содержит классы, интерфейсы, перечисления и типы аннотаций, которые вы хотите включить в пакет.
Оператор package должен быть первой строкой в исходном файле. Может быть только один запрос package в каждом исходном файле, и он применяется ко всем типам в этом файле.
Если оператор package не использован, тогда классы, интерфейсы, перечисления и типы аннотаций будут помещены в текущий пакет по умолчанию.
Чтобы скомпилировать программы на Java с операторами package, то вам нужно использовать опцию –d, как показано ниже.
Затем в указанном месте назначения создается папка с указанным именем пакета, а файлы скомпилированных классов будут помещены в эту папку.
Специальный блок кода, похожий на метод, предназначенный для инициализации полей объекта при его создании
Конструктор, который не имеет параметров
super — используется для обращения к базовому классу, а this к текущему.
Если написать super(), то будет вызван конструктор базового класса, а если this(), то конструктор текущего класса. Это можно использовать, например, при вызове конструктора с параметрами:
Хотя мы можем создать обычный класс, который не является наследником, но фактически все классы наследуются от класса Object. Все остальные классы, даже те, которые мы добавляем в свой проект, являются неявно производными от класса Object. Поэтому все типы и классы могут реализовать те методы, которые определены в классе Object.
Метод finalize() вызывается перед тем, как объект будет удален garbage collector (сборщик мусора, далее gc). Существует много различных реализаций gc. Основа работы следующая: gc помечает объекты, на которые больше не ссылаются другие объекты для их удаления. Затем на одном из проходов помеченные объекты удаляются.
Вызов finalize() не гарантируется, т.к. приложение может быть завершено до того, как будет запущена ещё одна сборка мусора. Да, можно отменить сборку объекта с помощью метода finalize(), присвоив его ссылку какому-то статическому методу.
Коллизия в
Давайте разберемся, что делает каждый подход:
instanceof проверяет был ли объект создан на основе какого либо класса в отличии от getClass который возвращает точно тот класс от которого был создан
Тип перечисления. Создает новый определенный тип - группу значений.
- Enum может наследовать интерфейсы.
- Enum не может наследовать (extends) класс. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы:
- ordinal() - индекс константы
- values() - массив констант
- valueOf() - возвращает элемент перечисления с названием в скобках
Ключевое слово interface используется для создания полностью абстрактных классов. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не тела методов.
Наличие слова interface означает, что именно так должны выглядеть все классы, которые реализуют данный интерфейс. Таким образом, любой код, использующий конкретный интерфейс, знает только то, какие методы вызываются для этого интерфейса, но не более того.
Если нам надо определить функционал для группы разрозненных объектов, которые могут быть никак не связаны между собой
Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public. Класс, который собирается использовать определённый интерфейс, использует ключевое слово implements.
Множественное наследование дает возможность создать класс, наследованный от нескольких суперклассов. В отличии от некоторых других популярных объектно-ориентированных языков программирования, таких как С++ в Java запрещено множественное наследование от классов. Java не поддерживает множественное наследование классов потому, что это может привести к ромбовидной проблеме. И вместо того, чтобы искать способы решения этой проблемы, есть лучшие варианты, как мы можем добиться того же самого результата как множественное наследование.
-
Что такое перегрузка метода в Java?
Перегрузка методов - это возможность создавать несколько методов с одинаковым названием, но разными параметрами. Не все языки программирования позволяют это делать. Перегрузка методов - это часть такой составляющей ООП, как полиморфизм. (Если Вы не знаете, что такое ООП и полиморфизм - вернитесь к этой статье).
Дело в том, что перегрузка методов выполняет несколько функций:
1. Вы можете создать несколько конструкторов - с одним, двумя параметрами, и вообще без параметров. Программа будет выбирать тот, который подходит под заданные параметры.
2. В первом примере мы говорили о конструкторах. Но то же самое применимо и к обычным методам. Одним из главных плюсов является то, что Вам не нужно запоминать названия кучи методов, выполняющих похожую функцию.
-
Что такое нативные методы, их плюсы и минусы?
Нативные методы - это методы написанные на других языках (более низкого уровня), таких как С, С++, ассемблер.
Минусы: При обращении к методам native свойства переносимости и безопасности, присущие коду Java, будут утрачены. Практически невозможно использовать методы native в Jаvа-коде, который предназначен для загрузки из Internet или выполнения на удаленных компьютерах сети (примером являются аплеты). Не исключено, что работать с вашим кодом придется системе совершенно другой архитектуры, но если даже это и не так, система может просто запретить выполнение кода, не вызывающего доверия.
Плюсы: закрывает потребности: использование низкоуровневых функций для обращения к аппаратуре( к памяти ) выполнить какие то задачи, которые проще выполнить на низкоуровневом языке
Пример это hashCode(). Используется нативный метод потому что C++ имеет доступ к памяти.
-
Какие модификаторы доступа могут быть у класса?
Private - доступ к компоненту предоставляется только методам этого класса
Default - доступ к компоненту из любых классов из этого же пакета
Protected - доступ к компоненту из любых классов этого же пакета и классов наследников
Public - доступ из любого класса и пакета
-
Что такое final? Что может быть final? Как они работают?
В java есть ключевое слово – final
Модификатор final может применяться к переменным, параметрам методов, полям и методам класса или самим классам.
Класс не может иметь наследников;
Метод не может быть переопределен в классах наследниках;
Поле не может изменить свое значение после инициализации;
Параметры методов не могут изменять своё значение внутри метода;
Локальные переменные не могут быть изменены после присвоения им значения.
Сегодня поговорим о специальном модификаторе
final
. Он, можно сказать, “цементирует” те участки нашей программы, где нам нужно постоянное, однозначное, не меняющееся поведение. Его можно применять на трех участках нашей программы: в классах, методах и переменных.Следует также отметить, что к абстрактным классам (с ключевым словом abstract), нельзя применить модификатор final, т.к. это взаимоисключающие понятия.
-
Как реализовать свой Immutable тип данных?
Чтобы создать immutable класс необходимо :
1) Сделать класс final
2) Сделать все поля private
3) Не создавать конструктор по умолчанию и сеттеры для полей
4) В конструкторе с параметрами и геттерах проводить глубокое копирование получаемого/передаваемого объекта.
-
Как реализована неизменность String?
String - это ссылочный тип, который при создании экземпляра записывает строку в свое поле charов value, которое имеет модификатор доспупа private и модификатор final, то есть объект однажды создается и больше не изменяется
-
Что такое ключевое слово static? Что может быть static?
ключевым словом static помечают члены (поля или методы), которые принадлежат классу, а не экземпляру этого класса.
Это означает, что какое бы количество объектов вы не создали, всегда будет создан только один член, доступный для использования всеми экземплярами класса.
Ключевое слово static применимо к переменным, методам, блокам инициализации, импорту и вложенным классам (nested classes).
-
Могут ли нестатические методы перегрузить статические?
- может быть перегружен
- не будет. Класс потомок создаст свой статический метод не связанный с родительским классом
-
Что такое пакет? Как создать пакет?
Пакеты можно определить как группировку связанных типов (классы, интерфейсы, перечисления и аннотации), предоставляющий защиту доступа и управление пространством имён.
Некоторые из существующих пакетов в Java:
-
java.lang – связывает фундаментальные классы. -
java.io – классы для ввода и выводные функции связаны в этом пакете.
Программисты могут определять их пакеты для связывания групп классов/интерфейсов и т.д. Группировка связанных классов, реализованных вами, является хорошим практическим решением, т.к. программист сможет легко определить, что классы, интерфейсы, перечисления и аннотации связаны.
Так как пакет создаёт новое пространство имён, в нём не будет никаких конфликтов с именами в других пактах. Используя пакеты, легче предоставить управление доступом и легче найти связанные классы.
Создание пакета
Как создать пакет в Java? Во время создания пакета вы должны выбрать ему имя и включить оператор package вместе с этим именем поверх каждого исходного файла, который содержит классы, интерфейсы, перечисления и типы аннотаций, которые вы хотите включить в пакет.
Оператор package должен быть первой строкой в исходном файле. Может быть только один запрос package в каждом исходном файле, и он применяется ко всем типам в этом файле.
Если оператор package не использован, тогда классы, интерфейсы, перечисления и типы аннотаций будут помещены в текущий пакет по умолчанию.
Чтобы скомпилировать программы на Java с операторами package, то вам нужно использовать опцию –d, как показано ниже.
Затем в указанном месте назначения создается папка с указанным именем пакета, а файлы скомпилированных классов будут помещены в эту папку.
-
Что такое конструкторы? Конструктор по-умолчанию?
Специальный блок кода, похожий на метод, предназначенный для инициализации полей объекта при его создании
Конструктор, который не имеет параметров
-
Расскажи, что такое this и super? Когда мы обязаны использовать this и super?
super — используется для обращения к базовому классу, а this к текущему.
Если написать super(), то будет вызван конструктор базового класса, а если this(), то конструктор текущего класса. Это можно использовать, например, при вызове конструктора с параметрами:
-
Класс Object и все методы кроме wait, notify, notifyAll
Хотя мы можем создать обычный класс, который не является наследником, но фактически все классы наследуются от класса Object. Все остальные классы, даже те, которые мы добавляем в свой проект, являются неявно производными от класса Object. Поэтому все типы и классы могут реализовать те методы, которые определены в классе Object.
-
public final native Class getClass() — возвращает в рантайме класс данного объекта. -
public native int hashCode() — возвращает хеш-код. Метод hashCode позволяет задать некоторое числовое значение, которое будет соответствовать этому объекту, или его хэш-код. По этому числу, например, можно сравнивать объекты. -
public boolean equals(Object obj) — сравнивает объекты. -
protected native Object clone() throws CloneNotSupportedException — клонирование объекта -
public String toString() — возвращает строковое представление объекта. -
protected void finalize() throws Throwable — вызывается сборщиком мусора, когда garbage collector определил, что ссылок на объект больше нет.
-
Зачем нужен метод finalize?
Метод finalize() вызывается перед тем, как объект будет удален garbage collector (сборщик мусора, далее gc). Существует много различных реализаций gc. Основа работы следующая: gc помечает объекты, на которые больше не ссылаются другие объекты для их удаления. Затем на одном из проходов помеченные объекты удаляются.
Вызов finalize() не гарантируется, т.к. приложение может быть завершено до того, как будет запущена ещё одна сборка мусора. Да, можно отменить сборку объекта с помощью метода finalize(), присвоив его ссылку какому-то статическому методу.
-
Из-за чего происходят коллизии?
Коллизия в
hashCode
— это ситуация, в которой два разных объекта имеют одинаковое значение hashCode
. Как это возможно? Дело в том, что hashcode
отображается в типе Integer
, который, в свою очередь, имеет диапазон от -2147483648 до 2147483647, то есть приблизительно 4 миллиарда разных целых чисел. Этот диапазон огромен, тем не менее, не бесконечен. Поэтому, возможны ситуации когда два совершенно разных объекта имеют одинаковый хеш-код. Это весьма маловероятно, но возможно. Увеличивать частоту одинаковых хеш-кодов может еще плохо реализованная хеш-функция, которая будет, к примеру, возвращать числа в небольшом диапазоне, что увеличит шанс коллизий. Для борьбы с коллизией нужно иметь хорошую имплементацию метода
hashCode
, чтобы разброс значений был максимальным и шанс повторения значений был минимальным.-
В чём разница между instanceOf и getClass?
Давайте разберемся, что делает каждый подход:
instanceof проверяет был ли объект создан на основе какого либо класса в отличии от getClass который возвращает точно тот класс от которого был создан
-
Перечислите методы именно класса Enum?
Тип перечисления. Создает новый определенный тип - группу значений.
- Enum может наследовать интерфейсы.
- Enum не может наследовать (extends) класс. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы:
- ordinal() - индекс константы
- values() - массив констант
- valueOf() - возвращает элемент перечисления с названием в скобках
-
Что такое интерфейс? Когда использовать интерфейс?
Ключевое слово interface используется для создания полностью абстрактных классов. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не тела методов.
Наличие слова interface означает, что именно так должны выглядеть все классы, которые реализуют данный интерфейс. Таким образом, любой код, использующий конкретный интерфейс, знает только то, какие методы вызываются для этого интерфейса, но не более того.
Если нам надо определить функционал для группы разрозненных объектов, которые могут быть никак не связаны между собой
-
Можно ли создать поля в интерфейсе?
Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public. Класс, который собирается использовать определённый интерфейс, использует ключевое слово implements.
-
Есть ли в Java множественное наследование? Зачем реализовывать интерфейс интерфейсу?
Множественное наследование дает возможность создать класс, наследованный от нескольких суперклассов. В отличии от некоторых других популярных объектно-ориентированных языков программирования, таких как С++ в Java запрещено множественное наследование от классов. Java не поддерживает множественное наследование классов потому, что это может привести к ромбовидной проблеме. И вместо того, чтобы искать способы решения этой проблемы, есть лучшие варианты, как мы можем добиться того же самого результата как множественное наследование.