❓ Почему метод clone() объявлен в классе Object, а не в интерфейсе Cloneable?
❗️Метод clone() объявлен в классе Object с указанием модификатора native, чтобы обеспечить доступ к стандартному механизму поверхностного копирования объектов. Одновременно он объявлен и как protected, чтобы нельзя было вызвать этот метод у не переопределивших его объектов. Непосредственно интерфейс Cloneable является маркерным (не содержит объявлений методов) и нужен только для обозначения самого факта, что данный объект готов к тому, чтобы быть клонированным. Вызов переопределённого метода clone() у не Cloneable объекта вызовет выбрасывание CloneNotSupportedException.
❓Какой способ клонирования предпочтительней?
❗️Наиболее безопасным и, следовательно, предпочтительным способом клонирования является использование специализированного конструктора копирования:
✔️Отсутствие ошибок наследования (не нужно беспокоиться, что у наследников появятся новые поля, которые не будут склонированы через метод clone());
✔️Поля для клонирования указываются явно;
✔️Возможность клонировать даже final поля.
❗️Метод clone() объявлен в классе Object с указанием модификатора native, чтобы обеспечить доступ к стандартному механизму поверхностного копирования объектов. Одновременно он объявлен и как protected, чтобы нельзя было вызвать этот метод у не переопределивших его объектов. Непосредственно интерфейс Cloneable является маркерным (не содержит объявлений методов) и нужен только для обозначения самого факта, что данный объект готов к тому, чтобы быть клонированным. Вызов переопределённого метода clone() у не Cloneable объекта вызовет выбрасывание CloneNotSupportedException.
❓Какой способ клонирования предпочтительней?
❗️Наиболее безопасным и, следовательно, предпочтительным способом клонирования является использование специализированного конструктора копирования:
✔️Отсутствие ошибок наследования (не нужно беспокоиться, что у наследников появятся новые поля, которые не будут склонированы через метод clone());
✔️Поля для клонирования указываются явно;
✔️Возможность клонировать даже final поля.
Подборка самых полезных книг по изучению Java.
https://www.freecodecamp.org/news/must-read-books-to-learn-java-programming-327a3768ea2f/
https://www.freecodecamp.org/news/must-read-books-to-learn-java-programming-327a3768ea2f/
freeCodeCamp.org
Must-read books to learn Java programming
By javinpaul Hello everybody, today is the world of online courses. Everyone is talking about learning from online training, Youtube, free courses on Coursera and other websites, which is great as online courses to help you to learn faster, but, I be...
Что будет выведено на экран?
Anonymous Quiz
14%
Base::show() called
35%
Derived::show() called
47%
Compiler Error
4%
Runtime Error
final-методы нельзя переопределять в классах-наследниках. Если убрать этот модификатор, программа выведет Derived::show() called.
The Joy of Kotlin (2019)
Kotlin — это элегантный язык JVM с современными функциями и простой интеграцией с Java. Книга обучает практическим методам улучшения абстракции и дизайна, написания простого и понятного кода для создания поддерживаемых качественных приложений. Написано для разработчиков Java или Kotlin.
Скачать книгу
Kotlin — это элегантный язык JVM с современными функциями и простой интеграцией с Java. Книга обучает практическим методам улучшения абстракции и дизайна, написания простого и понятного кода для создания поддерживаемых качественных приложений. Написано для разработчиков Java или Kotlin.
Скачать книгу
Telegram
Книги для программистов (reserved)
The Joy of Kotlin (2019)
Автор: Pierre-Yves Saumont
Автор: Pierre-Yves Saumont
#вопросы_с_собеседований
Что такое «функциональные интерфейсы»?
Что такое «функциональные интерфейсы»?
Функциональный интерфейс — это интерфейс, который определяет только один абстрактный метод.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация FunctionalInterface, работающая по принципу Override. Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Интерфейс может включать сколько угодно default-методов и при этом оставаться функциональным, потому что default-методы не абстрактные.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация FunctionalInterface, работающая по принципу Override. Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
Интерфейс может включать сколько угодно default-методов и при этом оставаться функциональным, потому что default-методы не абстрактные.
Я сейчас прохожу курсы на платформе...
Anonymous Poll
10%
Coursera
9%
Stepik
3%
Skillbox
1%
Udacity
14%
Udemy
5%
Geekbrains
1%
Openedu
23%
Другая платформа
36%
Не прохожу никаких курсов
Какие платформы мы не упомянули, но которые вы используете?
В мультифункциональной команде, создающей приложение под Kubernetes, разработчику стоит знать основы Kubernetes. Возможности и ограничения Кубернетес диктуют архитектуру приложения. К тому же разработчикам иногда приходится самим деплоить приложение, настраивать мониторинг, вплоть до создания окружений.
Понимание того, как эксплуатируется приложение, превращает разработчика в инженера.
7 апреля стартует цикл из 19 бесплатных вебинаров от Слёрма по основам Kubernetes. Для прохождения достаточно знать Linux.
Вебинары идут 1-2 раза в неделю в 20:00 по Москве.
Регистрация: https://proglib.io/w/3ac63579
Понимание того, как эксплуатируется приложение, превращает разработчика в инженера.
7 апреля стартует цикл из 19 бесплатных вебинаров от Слёрма по основам Kubernetes. Для прохождения достаточно знать Linux.
Вебинары идут 1-2 раза в неделю в 20:00 по Москве.
Регистрация: https://proglib.io/w/3ac63579
Что будет выведено на экран?
Anonymous Quiz
29%
Compilation error
14%
Runtime error
20%
Test
37%
Test Test
#вопросы_с_собеседований
Возможно ли при переопределении метода изменить: модификатор доступа, возвращаемый тип, тип аргумента или их количество, имена аргументов или их порядок; убирать, добавлять, изменять порядок следования элементов секции throws?
Возможно ли при переопределении метода изменить: модификатор доступа, возвращаемый тип, тип аргумента или их количество, имена аргументов или их порядок; убирать, добавлять, изменять порядок следования элементов секции throws?
При переопределении метода сужать модификатор доступа не разрешается, т.к. это приведёт к нарушению принципа подстановки Барбары Лисков. Расширение уровня доступа возможно.
Можно изменять все, что не мешает компилятору понять какой метод родительского класса имеется в виду:
✔️Изменять тип возвращаемого значения при переопределении метода разрешено только в сторону сужения типа (вместо родительского класса - наследника).
✔️При изменении типа, количества, порядка следования аргументов вместо переопределения будет происходить перегрузка метода.
✔️Секцию throws метода можно не указывать, но стоит помнить, что она остаётся действительной, если уже определена у метода родительского класса. Также возможно добавлять новые исключения, являющиеся наследниками от уже объявленных или исключения RuntimeException. Порядок следования таких элементов при переопределении значения не имеет.
Можно изменять все, что не мешает компилятору понять какой метод родительского класса имеется в виду:
✔️Изменять тип возвращаемого значения при переопределении метода разрешено только в сторону сужения типа (вместо родительского класса - наследника).
✔️При изменении типа, количества, порядка следования аргументов вместо переопределения будет происходить перегрузка метода.
✔️Секцию throws метода можно не указывать, но стоит помнить, что она остаётся действительной, если уже определена у метода родительского класса. Также возможно добавлять новые исключения, являющиеся наследниками от уже объявленных или исключения RuntimeException. Порядок следования таких элементов при переопределении значения не имеет.