Перегрузка в Java
Перегрузка позволяет различным методам иметь одно и то же имя, но разные сигнатуры, где сигнатура может отличаться по количеству входных параметров или по типу входных параметров, либо по обоим этим признакам.
Подписывайтесь на канал 👉@coddy_academy
#java
21 апреля в Слёрм стартует курс «Безопасность проекта: аутентификация в Keycloak»
👩🏻💻Keycloak — опенсорсный инструмент для настройки уровня безопасности в приложениях. Он упрощает реализацию защиты, позволяет отделить управление пользователями от логики приложения, организовать SSO и многое другое.
⚡️На курсе вы получите фундаментальные знания по работе с Keycloak и узнаете, как обеспечьте безопасность проекта с минимальными усилиям
📌Кому подойдёт курс
— DevOps-инженерам — поймёте, зачем нужен Keycloak, и научитесь его разворачивать и поддерживать.
— Разработчикам — узнаете, когда можно не писать свою аутентификацию, и научитесь работать с OIDC из вашего приложения.
— Тимлидам и техническим директорам — разберётесь, как использовать единый инструмент аутентификации для вашей инфраструктуры и приложений.
🔰Спикеры:
— Виктор Попов, Техлид DevOps-команды платформы корневых сервисов в X5 Tech.
— Ирина Блажина, Корпоративный архитектор X5 Group
⏱Длительность: 1 неделя, старт 21 апреля
Посмотреть программу и записаться: https://slurm.club/36Z5aJa
Параметры в Java передаются по ссылке или по значению?
Этот вопрос уходит корнями в C++ прошлое (скорее всего интервьюера), это терминология из C++. Для начала нужно разобраться в этой терминологии.
В C++ ссылка – это переменная-псевдоним для другой переменной. Меняя значение ссылки, поменяется и оригинал. В Java такого нет, легко понять это подумав например о ссылке на int.
Ссылка в Java – это нечто похожее на адрес объекта в памяти. Похожая сущность в C++ называется указатель.
Передача параметра по значению – это копирование значения в переменную-параметр метода. По ссылке – передача ссылки, то есть по сути использование той же самой переменной. Разобраться подробнее (осторожно, много C++).
В Java параметр метода – всегда копия. Значит параметры передаются всегда по значению, просто это значение может быть ссылкой на объект. Код ниже это демонстрирует.
#JVM
Освойте бэкенд-разработку на Java с нуля
Рынок постоянно нуждается в Java-разработчиках. Это универсальный язык, на котором пишут сайты, интернет-магазины, мобильные приложения и даже игры. Код, написанный на Java, отличается надёжностью и стабильностью, поэтому, помимо малого и среднего бизнеса, он интересен банкам и крупным компаниям, таким как Google, Airbnb, Netflix, Twitter, Steam.
.
Совместно со специалистами Альфа-банка мы разработали программу «Java-разработчик с нуля». Вы научитесь программировать на Java, использовать фреймворк Spring, проектировать алгоритмы, применять структуры данных, работать с системой Git. Среди ваших практических проектов — чатбот для Telegram, сервис перевода денег и облачное хранилище. После выпуска вы сможете принять участие в отборе на открытие вакансии Альфа-банка и оплачиваемую стажировку в дочернюю IT-компанию Сбербанка «КОРУС» с возможностью дальнейшего трудоустройства.
Узнать подробнее о профессии - https://netolo.gy/h6T
✅ Перезагрузка — одна из тем, необходимая для сертификации OCAJP. Это мощная техника для случаев, когда вам нужно одинаковое имя метода с разными параметрами. Вместо того, чтобы дублировать имя метода, вы можете просто перегрузить его.
📌 20 апреля в 20:00 (мск) состоится открытый вебинар, на котором мы рассмотрим перегрузку методов в Java. Занятие проведет Дмитрий Коган, эксперт Java, председатель совета крупнейшего IT-предприятия DXC Technology.
💻 Demo-занятие является частью онлайн-курса «Подготовка к сертификации OCAJP». Не упустите шанс познакомиться с экспертом!
HashMapsHashMap – это встроенная структура данных, которая хранит набор пар ключ-значение. Каждый ключ действует как уникальный идентификатор для связанного с ним значения.
Чтобы использовать эту структуру данных, импортируйте HashMap класс в верхней части программы.
Подписывайтесь на канал 👉@coddy_academy
#java
new String("Hello_42") == "Hello_" + 42?
Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.
Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.
Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42ложно.
#Строки
#JVM
3 причины учить Java начинающему программисту.
1. Java уже 8 лет входит в пятёрку самых топовых языков по данным StackOverflow. И это не просто хайп:
На Java пишут сервера, корпоративные системы, банковские приложения, игры (привет, Майнкрафт) и нейросети. Его используют Netflix, Amazon, Ebay и даже NASA.
2. На hh.ru открыто почти 3 000 вакансий для Java-разработчика. Кодеров ищут банки, госсектор и телекомы. 25% компаний предлагают удалёнку — сможете работать откуда угодно.
3. Java-разработчикам много платят. Уже джуниором будете зарабатывать от 75 000 рублей. Сеньорам готовы платить от 350 000 рублей — потолка нет.
Оставьте заявку, а мы откроем доступ к первым 5 модулям курса. Это 5 часов интенсивной теории и практики с опытным преподавателем.
Вы оцените качество уроков, освоите азы профессии, а полученные знания закрепите в домашних заданиях.
Переходите на сайт и оставляйте заявку: https://clc.to/IjqDSA
new Integer(128) == 128?
Для всех классов-оберток над примитивами кроме Float и Double работает механизм кэширования. Некоторые значения создаются на этапе инициализации класса, и переиспользуются когда объект создается не оператором new (например с помощью valueOf).
Кэшируемые значения – оба возможных Boolean, Character до '\u007f' (127) и все целые числа от -128 до 127 включительно. С Java 7 верхнюю границу для Integerможно увеличить параметром java.lang.Integer.IntegerCache.high.
Значения кэшируются и во многих других встроенных классах: BigDecimal, Currency, пустые коллекции. Детали можно узнавать из исходников и документаций, так как эти кэши реализованы не на уровне JVM а в коде классов.
В конкретно этом примере скрыт еще один подвох: объект класса-обертки сравнивается с примитивом. Это приводит к анбоксингу и сравнению значений. И ответ на вопрос – да.
#Классы
Опишите процесс создания экземпляра класса
Сначала класс и цепочка его предков должны быть загружены, сверху вниз. Рассмотрим ClassLoader и процесс загрузки классов в будущих постах. Здесь важно сказать, что класс загружается только один раз, при первом к нему обращении в рамках одного класслоадера.
После загрузки каждого класса выделяется память под его статические поля и выполняются статические блоки инициализации. В будущем возможно будет ленивой не только загрузка всего класса, но и инициализация его статических финальных полей.
Далее инстанциируется сам экземпляр. Как и с загрузкой классов, процесс выполняется для всей цепочки наследования, с самого дальнего родителя:
1. Выделяется память в куче для экземпляра, получается ссылка на этот экземпляр;
2. Выполняются инициализации нестатических полей и блоков инициализации в порядке объявления;
3. Вызывается конструктор;
Статические поля интерфейсов не инициализируются при создании объекта, а другого состояния интерфейс не имеет – это исключает вопрос порядка инициализации предков при множественном наследовании.
В процессе конструирования объекта может возникать проблема виртуального вызова в конструкторе, свойственная для многих языков. Effective Java Item 17 рекомендует не использовать переопределяемые методы в расширяемом классе. Иллюстрация неочевидного поведения в результате приведена ниже:
В чем разница между разными модификаторами доступа?
🔘 private – доступ только непосредственно из этого класса и его внутренних/вложенных классов;
🔘 package-private – доступ из всех классов этого пакета. Наследники доступа не имеют. Применяется когда модификатор не указан;
🔘 protected – доступ из всех классов этого пакета и всех наследников;
🔘 public – никаких ограничений доступа;
Модификаторы доступа применяются к классам, интерфейсам, методам и полям. Они нужны для реализации принципа наименьших привилегий и для отделения внутренней реализации от частей публичного API.
Вопросу посвящен Effective Java Item 13 и глава 6.6 спецификации.
#Классы
✅ Собираешься получать сертификат Oracle Java Programmer?
🔥 Начни подготовку с вебинара «Переопределение, скрытие, передекларация» в OTUS. Урок проведет Дмитрий Коган, эксперт Java, 6 апреля в 20:00.
📚 Мы рассмотрим четыре правила: переопределение и скрытие методов в Java, передекларацию и скрытие переменных, а после познакомимся с пятым.
📌 Demo-занятие пройдет в рамках онлайн-курса «Подготовка к сертификации Oracle Java Programmer (OCAJP)», где вы натренируетесь решать задачи и глубоко погрузитесь в возможности Java.
👉 Регистрация на вебинарhttps://otus.pw/6JYU/
Что такое static?
Ключевое слово static используется для объявления вложенных классов, статических методов, полей, блоков инициализации и статических импортов.
Статические поля и методы – члены класса а не экземпляра, потому к ним можно обращаться через имя класса. Код статического блока или метода имеет доступ только к статическим членам. Статические поля не участвуют в сериализации.
Для статических методов используется раннее связывание, то есть вызов конкретного метода разрешается на этапе компиляции, не работают перегрузка и переопределение в наследниках.
Статический блок инициализации выполняется потокобезопасно, один раз сразу после загрузки класса класслоадером. Инициализаторы статических полей выполняются в неявном статическом блоке. Блоков может быть несколько, выполнятся они в порядке объявления.
Статический импорт (static import) импортирует статические члены классов в .java-файл.
#Классы
Web чат на Java фреймворке Vaadin, без единой строки HTML, JS, CSS
За Java давно закрепилась слава слишком многословного языка. При этом люди часто забывают, что многословность это не черта самой платформы и экосистемы, а отдельновзятых неудачных решений в прошлом. Времена, когда на джаве нужно было написать пару десятков файлов конфигураций, давно прошли. Современные версии языка вкупе с современными фреймворками позволяют решать проблемы разработчиков и бизнеса очень быстро и легко.
Один из таких примеров как раз фреймворк Vaadin, речь о котором идёт в этом видео, где я создаю простой многопользовательский вэб чат в виде SPA приложения.
Код из видео:
https://github.com/drucoder/vaadin-chat
Сайт Vaadin:
https://vaadin.com/
Генератор проекта Spring:
https://start.spring.io/
🎯href='https://otus.pw/4fzH/'>Тест по Cloud Solution Architecture от OTUS
Ответьте на 25 вопросов и проверьте, насколько вы готовы к обучению на курсе Cloud Solution Architecture
Курс предназначен прежде всего для архитекторов и разработчиков, но также обеспечивает развитие до уровня Сloud Native специалистов других профилей.
📌Старт занятий 30 марта
Успейте на онлайн-курс «Cloud Solution Architecture» и уже через 6 месяцев вы сможете проектировать и переносить свои приложения в облаках.
Время прохождения теста ограниченно 40 минут
👉🏻 ПРОЙТИ ТЕСТ
https://otus.pw/4fzH/
Какие существуют типы в Java?
В качестве типа переменной в Java может использоваться одна из пяти сущностей:
1. примитивный тип;
2. class – сложный тип, с поведением (API), возможно его реализацией и внутренним состоянием;
3. enum – перечисление. Тип с заданным конечным набором возможных значений;
4. interface – только описание поведения, без состояния. С Java 8 может иметь дефолтную реализацию. Возможно множественное наследование интерфейсов;
5. @interface – аннотация. Пассивная метаинформация уровня класса: само ее наличие, параметры и поведение. Обычно используется для описания особых свойств (@Deprecated), для использования фреймворками (@Test) или инструментами разработки (@NotNull);
Новые примитивы создавать пока нельзя. Остальные типы называются ссылочными – переменная несет не значение, а ссылку на экземпляр. Для каждого ссылочного типа при компиляции создается отдельный .class файл. Его содержимое рассмотрим позднее.
Теме посвящена глава 8 спецификации.
Класс бывает:
1. Абстрактный – помеченный ключевым словом abstract. Не может иметь экземпляры, может иметь нереализованные абстрактные методы, также с модификатором abstract и без тела. Похож на частично реализованный интерфейс с состоянием, хотя с точки зрения JVM это совсем другая сущность;
2. Внутренний (inner, non-static nested) – объявленный внутри другого класса. Не может иметь статических объявлений. Имеет доступ ко всем внутренностям экземпляра внешнего класса. Если член внешнего класса foo перекрыт членом внутреннего (shadowing), обратиться к внешнему можно с помощью конструкции OuterClassname.this.foo, без перекрытия сработает просто foo. Инстанциируется только от экземпляра внешнего класса: outer.new Inner();
3. Вложенный (nested, inner static) – имеет доступ ко всем статическим членам внешнего класса. В остальном ничем не отличается от обычного класса;
4. Локальный – объявленный внутри метода. Является внутренним классом, в случае объявления в статическом методе без доступа к экземпляру внешнего класса. Не имеет модификаторов доступа;
5. Анонимный – локальный класс, объявленный без имени, непосредственно при инстанциировании, расширением другого класса или интерфейса. В отличие от других вложенных классов, анонимный может расширять только один класс или интерфейс. Не может быть абстрактным или финальным. Лямбда-выражение является сокращенной записью создания объекта анонимного наследника функционального интерфейса;
6. Финальный – с модификатором final, нерасширяемый;
Внутренние и вложенные классы могут иметь несколько уровней вложенности. Модификаторы abstract и final несовместимы, но по отдельности применимы к различным внутренним классам (кроме анонимного). Подробно разные виды вложенных классов рассмотрены в официальном туториале.
#Классы