Когда использовать рефлексии?
Уверен многих кто только начал учить ReflectionAPI удивили возможности этого инструмента. Но работа с ним довольно тяжёлая для системы, поэтому лучше использовать её в крайних случаях.
К примеру — обработка класса с аннотациями (пример выше). Извлекая аннотации из объектов класса, можно обрабатывать её каким угодно образом.
Также рефлексии часто применяют в тестировке, а именно для приватных полей и методов. Достаточно получить метод из класса, задать method.isAccessible(true) и можно вызывать его как публичный.
Уверен многих кто только начал учить ReflectionAPI удивили возможности этого инструмента. Но работа с ним довольно тяжёлая для системы, поэтому лучше использовать её в крайних случаях.
К примеру — обработка класса с аннотациями (пример выше). Извлекая аннотации из объектов класса, можно обрабатывать её каким угодно образом.
Также рефлексии часто применяют в тестировке, а именно для приватных полей и методов. Достаточно получить метод из класса, задать method.isAccessible(true) и можно вызывать его как публичный.
Может ли статический метод быть переопределён или перегружен?
Cтатические методы не могут быть переопределены или перегружены в подклассах.
Причина в том, что статические методы принадлежат классу, а не объекту. Они вызываются через имя класса, а не через ссылку на объект.
Переопределение и перегрузка работают только с нестатическими методами в иерархии классов. При вызове нестатического метода используется динамическая диспетчеризация для определения нужной реализации метода в runtime.
Но со статическими методами так не работает. Компилятор связывает вызов статического метода с конкретным классом во время компиляции. Поэтому статические методы не могут быть переопределены или перегружены.
Cтатические методы не могут быть переопределены или перегружены в подклассах.
Причина в том, что статические методы принадлежат классу, а не объекту. Они вызываются через имя класса, а не через ссылку на объект.
Переопределение и перегрузка работают только с нестатическими методами в иерархии классов. При вызове нестатического метода используется динамическая диспетчеризация для определения нужной реализации метода в runtime.
Но со статическими методами так не работает. Компилятор связывает вызов статического метода с конкретным классом во время компиляции. Поэтому статические методы не могут быть переопределены или перегружены.
😢5🎉3❤1🌚1
Какова иерархия исключений?
В Java иерархия исключений выстраивается следующим образом:
— Все исключения являются потомками класса Throwable.
— Класс Throwable имеет два подкласса: Exception и Error.
— Класс Exception предназначен для исключений, возникающих во время выполнения программы. Он делится на два подкласса:
— Checked exception — исключения, которые обязательно нужно обрабатывать или объявлять. К ним относятся SQLException, IOException и другие.
— Unchecked exception (RuntimeException) — исключения, обработка которых необязательна. Например, NullPointerException, ArithmeticException.
— Класс Error предназначен для ошибок, возникающих вне программы. Это могут быть ошибки JVM, например OutOfMemoryError.
При разработке приложений важно выбирать нужный тип исключения, чтобы правильно обрабатывать различные ситуации.
В Java иерархия исключений выстраивается следующим образом:
— Все исключения являются потомками класса Throwable.
— Класс Throwable имеет два подкласса: Exception и Error.
— Класс Exception предназначен для исключений, возникающих во время выполнения программы. Он делится на два подкласса:
— Checked exception — исключения, которые обязательно нужно обрабатывать или объявлять. К ним относятся SQLException, IOException и другие.
— Unchecked exception (RuntimeException) — исключения, обработка которых необязательна. Например, NullPointerException, ArithmeticException.
— Класс Error предназначен для ошибок, возникающих вне программы. Это могут быть ошибки JVM, например OutOfMemoryError.
При разработке приложений важно выбирать нужный тип исключения, чтобы правильно обрабатывать различные ситуации.
❤7👍4
Что такое анонимные классы и где они применяются?
Анонимные классы — это классы без имени, которые используются для создания объекта определенного класса или интерфейса «на лету».
Анонимные классы удобны, когда нужно создать простой класс «одноразового использования» для какой-то конкретной задачи. Они позволяют избежать громоздких именованных классов в таких случаях.
Чаще всего они применяются для:
— создания обработчика событий в GUI-приложениях.
— создания компаратора или другого функционального интерфейса для сортировки или фильтрации коллекций.
— расширения класса путем создания подкласса без имени.
Анонимные классы — это классы без имени, которые используются для создания объекта определенного класса или интерфейса «на лету».
Анонимные классы удобны, когда нужно создать простой класс «одноразового использования» для какой-то конкретной задачи. Они позволяют избежать громоздких именованных классов в таких случаях.
Чаще всего они применяются для:
— создания обработчика событий в GUI-приложениях.
— создания компаратора или другого функционального интерфейса для сортировки или фильтрации коллекций.
— расширения класса путем создания подкласса без имени.
👍9
Можно ли использовать private или protected переменные в interface?
Ответ: В Java переменные, объявленные с модификаторами private или protected, не могут быть использованы непосредственно в интерфейсах (interfaces). Интерфейсы содержат только абстрактные методы, константы и методы по умолчанию (default methods), которые все являются public.
Ответ: В Java переменные, объявленные с модификаторами private или protected, не могут быть использованы непосредственно в интерфейсах (interfaces). Интерфейсы содержат только абстрактные методы, константы и методы по умолчанию (default methods), которые все являются public.
👍7😢2
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
👍5
В чем разница между интерфейсами Comparable и Comparator?
Основное различие между интерфейсами Comparable и Comparator заключается в том, что в Comparable «зашит» один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку. Архитектурно, Comparable — это интерфейс значения, в то время как Comparator — настройка контейнера.
Следует использовать Comparable, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел — сравнение по значению. Во всех остальных случаях — без отдельного компаратора не обойтись.
Основное различие между интерфейсами Comparable и Comparator заключается в том, что в Comparable «зашит» один-единственный алгоритм сравнения объектов, в то время как Comparator представляет собой внешнюю заменяемую настройку. Архитектурно, Comparable — это интерфейс значения, в то время как Comparator — настройка контейнера.
Следует использовать Comparable, когда задается естественный (наиболее логичный) порядок. Например, для строк это регистрозависимое лексикографическое сравнение, а для длинных чисел — сравнение по значению. Во всех остальных случаях — без отдельного компаратора не обойтись.
👍8🤯3
Может ли метод main выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?
Метод main может выбросить исключение. Это исключение будет передано в JVM (виртуальную машину Java). JVM отловит это исключение и завершит выполнение программы, выведя stack trace (трассировку стека) исключения.
Таким образом, исключение из main приведет к аварийному завершению программы.
Чтобы избежать этого, лучшей практикой является перехватывать исключения внутри main и обрабатывать их, не допуская выброса за его пределы.
Метод main может выбросить исключение. Это исключение будет передано в JVM (виртуальную машину Java). JVM отловит это исключение и завершит выполнение программы, выведя stack trace (трассировку стека) исключения.
Таким образом, исключение из main приведет к аварийному завершению программы.
Чтобы избежать этого, лучшей практикой является перехватывать исключения внутри main и обрабатывать их, не допуская выброса за его пределы.
👍6😢1
Почему нежелательно использовать Thread.stop()?
Thread.stop() считается нежелательным для использования, потому что он не является безопасным. Остановка потока приводит к разблокированию всех мониторов, которые он заблокировал. Если какие-либо объекты, ранее защищенные этими мониторами, находились в несогласованном состоянии, другие потоки могут видеть эти объекты в несогласованном состоянии. Такие объекты называются поврежденными. Когда потоки работают с поврежденными объектами, может возникнуть произвольное поведение.
Вместо использования Thread.stop() рекомендуется использовать согласованный механизм, такой как interrupt.
Thread.stop() считается нежелательным для использования, потому что он не является безопасным. Остановка потока приводит к разблокированию всех мониторов, которые он заблокировал. Если какие-либо объекты, ранее защищенные этими мониторами, находились в несогласованном состоянии, другие потоки могут видеть эти объекты в несогласованном состоянии. Такие объекты называются поврежденными. Когда потоки работают с поврежденными объектами, может возникнуть произвольное поведение.
Вместо использования Thread.stop() рекомендуется использовать согласованный механизм, такой как interrupt.
👍1
Поддерживает ли язык Java множественное наследование?
Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?
Ответ несколько более сложен, чем может показаться на первый взгляд, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
Это очень хитрый вопрос. Интервьюеры часто говорят: если язык C++ может поддерживать непосредственное множественное наследование, то почему Java не может?
Ответ несколько более сложен, чем может показаться на первый взгляд, поскольку Java поддерживает множественное наследование типов, ведь интерфейс в нём может расширять другие интерфейсы. Но множественное наследование реализаций язык Java не поддерживает.
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Для чего в JUnit используется аннотация @Ignore?
Ответ: Аннотация указывает JUnit на необходимость пропустить данный тестовый метод.
Ответ: Аннотация указывает JUnit на необходимость пропустить данный тестовый метод.
👍5
Чем отличается Lambda от анонимного класса?
Хотя в некоторых случаях они и могут быть использованы взаимозаменяемо, Lambda-выражения и анонимные классы имеют различия.
Разберем основные из них:
1. Синтаксис: Lambda-выражения имеют более краткий и лаконичный синтаксис по сравнению с анонимными классами.
2. Область применения: Lambda-выражения могут быть использованы только для функциональных интерфейсов, в то время как анонимные классы могут быть использованы для любых интерфейсов и абстрактных классов.
3. Ключевое слово this: В анонимных классах ключевое слово this ссылается на сам анонимный класс, в то время как в lambda-выражениях this ссылается на объемлющий.
4. Производительность: Lambda-выражения обычно имеют лучшую производительность по сравнению с анонимными классами, так как они компилируются в приватные методы и используют инструкцию invokedynamic.
Хотя в некоторых случаях они и могут быть использованы взаимозаменяемо, Lambda-выражения и анонимные классы имеют различия.
Разберем основные из них:
1. Синтаксис: Lambda-выражения имеют более краткий и лаконичный синтаксис по сравнению с анонимными классами.
2. Область применения: Lambda-выражения могут быть использованы только для функциональных интерфейсов, в то время как анонимные классы могут быть использованы для любых интерфейсов и абстрактных классов.
3. Ключевое слово this: В анонимных классах ключевое слово this ссылается на сам анонимный класс, в то время как в lambda-выражениях this ссылается на объемлющий.
4. Производительность: Lambda-выражения обычно имеют лучшую производительность по сравнению с анонимными классами, так как они компилируются в приватные методы и используют инструкцию invokedynamic.
👍6🔥2
Какие коллекции синхронизированы?
Vector — синхронизированный аналог ArrayList.
Hashtable — синхронизированный аналог HashMap.
Stack — синхронизированный стек на основе Vector.
Collections.synchronizedList() — возвращает синхронизированный список на основе переданного в нее списка.
Collections.synchronizedSet() — то же самое для множества.
Collections.synchronizedMap() — для отображения.
Синхронизация в этих коллекциях реализована с помощью внутренних блокировок, которые упорядочивает доступ к коллекции из разных потоков.
Обычно предпочтительнее использовать несинхронизированные коллекции и синхронизировать доступ к ним самостоятельно при необходимости, чтобы не терять производительность.
Это можно сделать с помощью методов synchronizedCollection(), synchronizedList(), synchronizedSet(), synchronizedMap().
Vector — синхронизированный аналог ArrayList.
Hashtable — синхронизированный аналог HashMap.
Stack — синхронизированный стек на основе Vector.
Collections.synchronizedList() — возвращает синхронизированный список на основе переданного в нее списка.
Collections.synchronizedSet() — то же самое для множества.
Collections.synchronizedMap() — для отображения.
Синхронизация в этих коллекциях реализована с помощью внутренних блокировок, которые упорядочивает доступ к коллекции из разных потоков.
Обычно предпочтительнее использовать несинхронизированные коллекции и синхронизировать доступ к ним самостоятельно при необходимости, чтобы не терять производительность.
Это можно сделать с помощью методов synchronizedCollection(), synchronizedList(), synchronizedSet(), synchronizedMap().
Курсы для тех, кто хочет получить новые скиллы или перейти в другую компанию на грейд выше.
У вас есть возможность начать любой курс с бесплатных вводных занятий, чтобы познакомиться с преподавателями и форматом обучения.
Какой курс выбрать?
🔹 Математика для Data Science
Наш cамый популярный, самый хардкорный курс по вышмату! На этом курсе вы получите все необходимые знания по математике для старта карьеры в DS или аналитике.
🔹 Алгоритмы и структуры данных
Курс, который на практике познакомит со сложными алгоритмами и научит писать более короткий и эффективный код.
🔹 Основы программирования на Python
Если вы только хотите начать свою карьеру в IT, то этот курс точно для вас. Вы сможете получить новую профессию за 13 990 рублей, поймете, насколько вам подходит работа с кодом.
Если вы не знаете, какой курс вам подойдет, оставляйте заявку, и наш менеджер поможет с этим и любым другим вопросом – https://proglib.io/w/155a301f
У вас есть возможность начать любой курс с бесплатных вводных занятий, чтобы познакомиться с преподавателями и форматом обучения.
Какой курс выбрать?
🔹 Математика для Data Science
Наш cамый популярный, самый хардкорный курс по вышмату! На этом курсе вы получите все необходимые знания по математике для старта карьеры в DS или аналитике.
🔹 Алгоритмы и структуры данных
Курс, который на практике познакомит со сложными алгоритмами и научит писать более короткий и эффективный код.
🔹 Основы программирования на Python
Если вы только хотите начать свою карьеру в IT, то этот курс точно для вас. Вы сможете получить новую профессию за 13 990 рублей, поймете, насколько вам подходит работа с кодом.
Если вы не знаете, какой курс вам подойдет, оставляйте заявку, и наш менеджер поможет с этим и любым другим вопросом – https://proglib.io/w/155a301f
👍3
Чем отличается абстрактный класс от интерфейса?
Ниже представлены основные отличия:
— Абстрактный класс может содержать как абстрактные, так и неабстрактные методы. Интерфейс содержит только сигнатуры методов, которые по умолчанию абстрактные.
— Абстрактный класс может содержать поля и реализованный код. В интерфейсе может быть только объявление констант.
— Класс может расширять только один класс (абстрактный или нет) и реализовывать множество интерфейсов.
— Объект абстрактного класса не может быть создан, тогда как интерфейс не является классом и его экземпляры создавать нельзя в принципе.
— Абстрактные классы используются для общих частично реализованных решений, интерфейсы — для определения зависимостей.
Ниже представлены основные отличия:
— Абстрактный класс может содержать как абстрактные, так и неабстрактные методы. Интерфейс содержит только сигнатуры методов, которые по умолчанию абстрактные.
— Абстрактный класс может содержать поля и реализованный код. В интерфейсе может быть только объявление констант.
— Класс может расширять только один класс (абстрактный или нет) и реализовывать множество интерфейсов.
— Объект абстрактного класса не может быть создан, тогда как интерфейс не является классом и его экземпляры создавать нельзя в принципе.
— Абстрактные классы используются для общих частично реализованных решений, интерфейсы — для определения зависимостей.
👍5❤4
Как хранятся соотношения one-to-one, one-to-many и many-to-many в виде таблиц?
Соотношения one-to-one, one-to-many и many-to-many в таблицах баз данных хранятся следующим образом:
Соотношение one-to-one — в одном primary key одной таблицы хранятся значения, связанные с другой одиночной таблицей во внешнем ключе (foreign key).
Соотношение one-to-many — в таблице, которая «one», в качестве primary key используется идентификатор объекта, который распространяется на все связанные объекты в таблице, которая «many». Так, одно значение может ссылаться на несколько значений в другой таблице.
Соотношение many-to-many — необходимо создать дополнительную таблицу, которая связывает связанные таблицы. Так, в этой дополнительной таблице устанавливается соответствие между primary key одной таблицы и primary key другой таблицы.
Соотношения one-to-one, one-to-many и many-to-many в таблицах баз данных хранятся следующим образом:
Соотношение one-to-one — в одном primary key одной таблицы хранятся значения, связанные с другой одиночной таблицей во внешнем ключе (foreign key).
Соотношение one-to-many — в таблице, которая «one», в качестве primary key используется идентификатор объекта, который распространяется на все связанные объекты в таблице, которая «many». Так, одно значение может ссылаться на несколько значений в другой таблице.
Соотношение many-to-many — необходимо создать дополнительную таблицу, которая связывает связанные таблицы. Так, в этой дополнительной таблице устанавливается соответствие между primary key одной таблицы и primary key другой таблицы.
👍5
Что делает метод flatMap?
Метод flatMap используется в контексте работы с потоками (streams) в пакете java.util.stream. Он представлен в интерфейсе Stream и предназначен для преобразования элементов потока, когда каждый элемент может быть преобразован в ноль или один элемент другого потока.
Метод flatMap применяет функцию mapper к каждому элементу исходного потока и «разворачивает» (сплющивает) поток элементов в один объединенный поток, игнорируя нулевые потоки, которые могут быть результатом преобразования.
Метод flatMap используется в контексте работы с потоками (streams) в пакете java.util.stream. Он представлен в интерфейсе Stream и предназначен для преобразования элементов потока, когда каждый элемент может быть преобразован в ноль или один элемент другого потока.
Метод flatMap применяет функцию mapper к каждому элементу исходного потока и «разворачивает» (сплющивает) поток элементов в один объединенный поток, игнорируя нулевые потоки, которые могут быть результатом преобразования.
👍3
Что такое ковариантность типов?
Ковариантность типов — это вариантность типов в системе типов языка программирования. Ковариантность означает, что типы могут быть связаны отношением «родитель-потомок» в иерархии классов или интерфейсов, и этот относительный порядок сохраняется при передаче аргументов методам или возвращении значений из методов. Другими словами, ковариантность позволяет использовать подтип (потомок) вместо его родителя без необходимости явного приведения типов.
Ковариантность типов — это вариантность типов в системе типов языка программирования. Ковариантность означает, что типы могут быть связаны отношением «родитель-потомок» в иерархии классов или интерфейсов, и этот относительный порядок сохраняется при передаче аргументов методам или возвращении значений из методов. Другими словами, ковариантность позволяет использовать подтип (потомок) вместо его родителя без необходимости явного приведения типов.