From c21621b5ddf1a84a42efd96912bf85143b476a6a Mon Sep 17 00:00:00 2001 From: roma-dxunvrs Date: Tue, 8 Sep 2026 10:01:11 +0300 Subject: [PATCH] 08.09.26 --- .../ООП/Наследование/Переопределение.md | 13 +++++++++- .../ООП/Полиморфизм/Ad-hoc (перегрузка).md | 24 +++++++++++++++++++ .../ООП/Статические классы.md | 0 .../Синтаксис и типы/Работа с данными и типами/Функции.md | 2 +- 4 files changed, 37 insertions(+), 2 deletions(-) delete mode 100644 Программирование на Java/ООП/Статические классы.md diff --git a/Программирование на Java/ООП/Наследование/Переопределение.md b/Программирование на Java/ООП/Наследование/Переопределение.md index bc8a49c..eb88cc5 100644 --- a/Программирование на Java/ООП/Наследование/Переопределение.md +++ b/Программирование на Java/ООП/Наследование/Переопределение.md @@ -49,4 +49,15 @@ class C extends A { ## Сигнатура метода при переопределении [[Функции#Сигнатура|Сигнатура]] должна совпадать, при этом имена параметров, как и положено, могут быть изменены ## Аннотация @Override -При переопределении можно использовать аннотацию `@Override` - компилятор проверит, правильно ли вы переопределяете метод (сигнатуру, модификаторы) \ No newline at end of file +При переопределении можно использовать аннотацию `@Override` - компилятор проверит, правильно ли вы переопределяете метод (сигнатуру, модификаторы) +## Тип ошибки при переопределении +Если родительский метод выбрасывал [[Система исключений|ошибку]] через `throws`, то в переопределяемом методе можно сужать тип ошибки (указывать наследников) +```Java +class A { + protected void method() throws Exception {} +} +class B extends A { + @Override + public void method() throws IOException {} +} +``` \ No newline at end of file diff --git a/Программирование на Java/ООП/Полиморфизм/Ad-hoc (перегрузка).md b/Программирование на Java/ООП/Полиморфизм/Ad-hoc (перегрузка).md index e69de29..fec9aea 100644 --- a/Программирование на Java/ООП/Полиморфизм/Ad-hoc (перегрузка).md +++ b/Программирование на Java/ООП/Полиморфизм/Ad-hoc (перегрузка).md @@ -0,0 +1,24 @@ +- Вид полиморфизма, связываемый на этапе компиляции (статическое связывание), при котором в одном классе (или наследниках) существуют методы с одинаковым именем, но разными [[Функции#Сигнатура|сигнатурами]] +## Приоритет выбора компилятором +1. Точное совпадение типов +2. Расширение примитивов (`int -> long -> float -> double`) +3. Автоупаковка/автораспаковка (`int -> Integer`) +4. Переменное число аргументов (`varargs`) +> [!hint] Два преобразования за раз компилятор сделать не может (например, сначала распаковать `Integer` в `int`, а затем привести к `double`) и будет ошибка компиляции +## Приоритет с объектами +Приоритет отдается более специфичному типу +```Java +public static void print(Object o) {sout("Obj");} +public static void print(String s) {sout("String");} + +print(null); // String +``` +Если конфликт типов (на одном уровне иерархии), то ошибка компиляции +## P.S +- Можно перегружать с абсолютно разными модификаторами, типами исключений, статик и нон-статик и т.п. +- Для модификаторов доступа - главное текущий `scope`. Компилятор сам определит какие методы сейчас можно вызвать в данной области видимости, затем, если надо преобразуя (по приоритетам, описанным ранее), вызовет метод +- Самое главное - различие сигнатуры +## Перегрука + [[Наследование]] +- Выбор сигнатуры перегруженного метода происходит во время компиляции на основе типа ссылки, а не типа объекта в памяти +- Если вызвать перегруженный метод через ссылку родительского типа (`Parent p = new Child()`), компилятор проигнорирует все методы, объявленные только в `Child` +- В рантайме вызовется переопределенный метод (если он был переопределен), но строго с той сигнатурой, которую выбрал компилятор \ No newline at end of file diff --git a/Программирование на Java/ООП/Статические классы.md b/Программирование на Java/ООП/Статические классы.md deleted file mode 100644 index e69de29..0000000 diff --git a/Программирование на Java/Синтаксис и типы/Работа с данными и типами/Функции.md b/Программирование на Java/Синтаксис и типы/Работа с данными и типами/Функции.md index 2ec1de2..6e0ec4b 100644 --- a/Программирование на Java/Синтаксис и типы/Работа с данными и типами/Функции.md +++ b/Программирование на Java/Синтаксис и типы/Работа с данными и типами/Функции.md @@ -18,7 +18,7 @@ modifiers return_type name (par_type par_name) {} - Для параметров и возвращаемых значений действуют правила приведения типов ## Сигнатура имя функции и параметры образуют сигнатуру -В сигнатуру НЕ входят: модификаторы, имена параметров, тип возвращаемого значения +В сигнатуру НЕ входят: модификаторы, имена параметров, тип возвращаемого значения, тип выбрасываемого исключения ## Локальные переменные и var - Локальные переменные - объявленные внутри блоки или метода - var можно использовать для локальных переменных, которые сразу инициализируются