Из чего состоит .class-файл?
.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:
🔘 Свойства файла: определяющее тип файла «волшебное слово»
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;
Для внутренних классов тоже создаются отдельные файлы с названиями формата
#JVM
.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:
🔘 Свойства файла: определяющее тип файла «волшебное слово»
0xCAFEBABE
и версия формата;🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;
Для внутренних классов тоже создаются отдельные файлы с названиями формата
OuterClass$InnerClass.class
. Если класс анонимный, вместо имени используются номера с 1.#JVM
👍12🔥2
Из чего состоит .class-файл?
.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:
🔘 Свойства файла: определяющее тип файла «волшебное слово»
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;
Для внутренних классов тоже создаются отдельные файлы с названиями формата
#JVM
.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:
🔘 Свойства файла: определяющее тип файла «волшебное слово»
0xCAFEBABE
и версия формата;🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;
Для внутренних классов тоже создаются отдельные файлы с названиями формата
OuterClass$InnerClass.class
. Если класс анонимный, вместо имени используются номера с 1.#JVM
🔥4👍2
Когда изучаешь Java, в ход идет всё: книжки, видео с Ютюба и комменты на
Хабре. И все же системные знания и практику тяжело заменить информацией из интернета.
В KATA Academy можно выучиться на Java-разработчика бесплатно, а
заплатить уже после трудоустройства — это прописано в договоре.
👉 Что это за модель и чем отличается от кредита:
— мы инвестируем в своих учеников: бесплатно обучаем их, а затем получаем процент от зарплаты разработчиков;
— нам не все равно, в кого вкладывать деньги — чтобы попасть на курсы,
нужно пройти отбор и выполнить тестовое;
— мы развиваем навыки ребят и после курсов: проводим выездные
мероприятия и мастер-классы — и доходы наших ребят растут;
— мы не зависим от банков и их рассрочек — кризис не повлиял на
доступность курсов.
С самого начала у нас была тактика: «После обучения в KATA Academy
выпускники получают работу, а не бумажку о том, что их пытались учить» — и мы ее придерживаемся.
Переходи по ссылке и оставляй заявку — пришлем тестовое задание.
Хабре. И все же системные знания и практику тяжело заменить информацией из интернета.
В KATA Academy можно выучиться на Java-разработчика бесплатно, а
заплатить уже после трудоустройства — это прописано в договоре.
👉 Что это за модель и чем отличается от кредита:
— мы инвестируем в своих учеников: бесплатно обучаем их, а затем получаем процент от зарплаты разработчиков;
— нам не все равно, в кого вкладывать деньги — чтобы попасть на курсы,
нужно пройти отбор и выполнить тестовое;
— мы развиваем навыки ребят и после курсов: проводим выездные
мероприятия и мастер-классы — и доходы наших ребят растут;
— мы не зависим от банков и их рассрочек — кризис не повлиял на
доступность курсов.
С самого начала у нас была тактика: «После обучения в KATA Academy
выпускники получают работу, а не бумажку о том, что их пытались учить» — и мы ее придерживаемся.
Переходи по ссылке и оставляй заявку — пришлем тестовое задание.
👎8👍4
Для чего используется оператор assert?
Assert (Утверждение) — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Утверждение может автоматически сигнализировать об обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных.
Утверждения существенно упрощают локализацию ошибок в коде. Даже проверка результатов выполнения очевидного кода может оказаться полезной при последующем рефакторинге, после которого код может стать не настолько очевидным и в него может закрасться ошибка.
Обычно утверждения оставляют включенными во время разработки и тестирования программ, но отключают в релиз-версиях программ.
Т.к. утверждения могут быть удалены на этапе компиляции либо во время исполнения программы, они не должны менять поведение программы. Если в результате удаления утверждения поведение программы может измениться, то это явный признак неправильного использования assert. Таким образом, внутри assert нельзя вызывать методы, изменяющие состояние программы, либо внешнего окружения программы.
В Java проверка утверждений реализована с помощью оператора
Assert (Утверждение) — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Утверждение может автоматически сигнализировать об обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных.
Утверждения существенно упрощают локализацию ошибок в коде. Даже проверка результатов выполнения очевидного кода может оказаться полезной при последующем рефакторинге, после которого код может стать не настолько очевидным и в него может закрасться ошибка.
Обычно утверждения оставляют включенными во время разработки и тестирования программ, но отключают в релиз-версиях программ.
Т.к. утверждения могут быть удалены на этапе компиляции либо во время исполнения программы, они не должны менять поведение программы. Если в результате удаления утверждения поведение программы может измениться, то это явный признак неправильного использования assert. Таким образом, внутри assert нельзя вызывать методы, изменяющие состояние программы, либо внешнего окружения программы.
В Java проверка утверждений реализована с помощью оператора
assert
, который имеет форму: [Выражение типа boolean];
или assert [Выражение типа boolean] : [Выражение любого типа, кроме void];
Во время выполнения программы в том случае, если поверка утверждений включена, вычисляется значение булевского выражения, и если его результат false
, то генерируется исключение java.lang.AssertionError
. В случае использования второй формы оператора assert выражение после двоеточия задаёт детальное сообщение о произошедшей ошибке (вычисленное выражение будет преобразовано в строку и передано конструктору AssertionError
).👍8
События последнего месяца изменили рынок труда. Часть компаний приостановили подбор сотрудников, другие распустили команду, а третьи наоборот активно нанимают. Оценить масштаб перемен пока сложно. Чтобы это сделать, AGIMA проводит круглый стол.
14 апреля в прямом эфире эксперты из Альфа-Банка, Tochka, Хабра, HeadHunter, Kaspersky и другие разберутся, чего ждать разработчикам:
- кого и где сокращают;
- какие компании начали активно нанимать;
- что будет с зарплатами;
- что делать уехавшим разработчикам;
- как компании помогают сотрудникам пережить кризис.
Цель встречи — найти тенденции в найме и дать прогнозы. Полезно будет для веб- и мобильных разработчиков, тимлидов, QA, DevOps.
Регистрируйтесь!
14 апреля в прямом эфире эксперты из Альфа-Банка, Tochka, Хабра, HeadHunter, Kaspersky и другие разберутся, чего ждать разработчикам:
- кого и где сокращают;
- какие компании начали активно нанимать;
- что будет с зарплатами;
- что делать уехавшим разработчикам;
- как компании помогают сотрудникам пережить кризис.
Цель встречи — найти тенденции в найме и дать прогнозы. Полезно будет для веб- и мобильных разработчиков, тимлидов, QA, DevOps.
Регистрируйтесь!
👍3
Можем ли мы перегружать статические методы?
Ответ - да. У нас может быть два или более статических метода с одинаковым именем, но с разными входными параметрами.
Можем ли мы перегрузить методы, которые отличаются только ключевым словом static?
Мы не можем перегрузить два метода в Java, если они отличаются только ключевым словом static (количество параметров и типы параметров одинаковы).
Можем ли мы перегрузить main() в Java?
Как и другие статические методы, мы можем перегрузить main() в Java.
#вопросыссобеседований
Ответ - да. У нас может быть два или более статических метода с одинаковым именем, но с разными входными параметрами.
Можем ли мы перегрузить методы, которые отличаются только ключевым словом static?
Мы не можем перегрузить два метода в Java, если они отличаются только ключевым словом static (количество параметров и типы параметров одинаковы).
Можем ли мы перегрузить main() в Java?
Как и другие статические методы, мы можем перегрузить main() в Java.
#вопросыссобеседований
👍7
Сколько памяти занимает объект?
Размер экземпляров ссылочных типов, как и примитивов, зависит от конкретной реализации JVM и параметров ее запуска. Обычно в вопросе подразумевается самая популярная машина – HotSpot от Oracle.
Размеры полей-примитивов бывают больше чем необходимо, например в целях выравнивания (alignment). Из-за того же выравнивания между полями в памяти могут возникать пустоты.
Как говорилось ранее, ссылка в Java – не то же самое что указатель в C++, это не адрес в памяти. Из-за этого размер поля-ссылки может не совпадать с размером машинного слова, например когда HotSpot использует оптимизацию «сжатие ссылок» (Compressed OOP).
Кроме полей и промежутков, каждый объект в HotSpot начинается с заголовка – runtime-метаинформации. Заголовок занимает от 8 до 16 байт.
В общем можно только сказать, что размер объекта строго больше суммы размеров его полей. Примерный размер конкретного объекта измеряется средствами инструментации.
#JVM
Размер экземпляров ссылочных типов, как и примитивов, зависит от конкретной реализации JVM и параметров ее запуска. Обычно в вопросе подразумевается самая популярная машина – HotSpot от Oracle.
Размеры полей-примитивов бывают больше чем необходимо, например в целях выравнивания (alignment). Из-за того же выравнивания между полями в памяти могут возникать пустоты.
Как говорилось ранее, ссылка в Java – не то же самое что указатель в C++, это не адрес в памяти. Из-за этого размер поля-ссылки может не совпадать с размером машинного слова, например когда HotSpot использует оптимизацию «сжатие ссылок» (Compressed OOP).
Кроме полей и промежутков, каждый объект в HotSpot начинается с заголовка – runtime-метаинформации. Заголовок занимает от 8 до 16 байт.
В общем можно только сказать, что размер объекта строго больше суммы размеров его полей. Примерный размер конкретного объекта измеряется средствами инструментации.
#JVM
👍7
Программа на Java, убирающая все переносы в строке
Для замены всех переносов («\n») можно использовать функцию
Таким образом с помощью функции
#вопросыссобеседований
Для замены всех переносов («\n») можно использовать функцию
replace()
. String replace() возвращает новый объект String, который содержит ту же последовательность символов, что и исходная строка, но с замененным символом.Таким образом с помощью функции
replace()
можно заменять любые символы в строке на нужные.#вопросыссобеседований
👍10👎5
Media is too big
VIEW IN TELEGRAM
Уроки Java с нуля
- Введение и установка. Что пишут на Java
- Условные операторы If, Else If, Switch case
- Циклы For, While, Do while
- Массивы. Перебор массива
- Методы, как их писать и что делают
- Работа со строками. Методы строк
- Введение в ООП. Создание класса. Конструкторы. This
- Основы ООП. Наследование
https://www.youtube.com/playlist?list=PLVfMKQXDAhGVWEKi2wKx4y-yNLk7QKam3
- Введение и установка. Что пишут на Java
- Условные операторы If, Else If, Switch case
- Циклы For, While, Do while
- Массивы. Перебор массива
- Методы, как их писать и что делают
- Работа со строками. Методы строк
- Введение в ООП. Создание класса. Конструкторы. This
- Основы ООП. Наследование
https://www.youtube.com/playlist?list=PLVfMKQXDAhGVWEKi2wKx4y-yNLk7QKam3
👍4👎1
Подборка каналов для IT специалистов 🎯
Вакансии 📌
https://t.me/progjob Вакансии для программистов
Системное администрирование 📌
https://t.me/i_DevOps Все для DevOps
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
Разработка игр 📌
https://t.me/game_devv GameDev: разработка игр
Программирование, Биг дата, книги 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/coddy_academy Академия кода
Шутки программистов 📌
https://t.me/itumor ITumor | программисты шутят
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Вакансии 📌
https://t.me/progjob Вакансии для программистов
Системное администрирование 📌
https://t.me/i_DevOps Все для DevOps
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
Разработка игр 📌
https://t.me/game_devv GameDev: разработка игр
Программирование, Биг дата, книги 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/coddy_academy Академия кода
Шутки программистов 📌
https://t.me/itumor ITumor | программисты шутят
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
❤2
Как работает сборка мусора?
Очередной вопрос, ответ на который нужно начинать с уточнения: в каком именно сборщике мусора? Понятие сборщика мусора вводится в спецификации JVM, но внутренности зависят от реализации. Одна JVM может содержать несколько сборщиков, один сборщик может применять разные алгоритмы в разных случаях. Вообще говоря, в теории GC может делать ничего. Метод
GC (garbage collector) – центральная тема шуток про «джава тормозит». Это необходимая плата за стабильное автоматическое управление памятью. Поэтому это одна из самых бурлящих и меняющихся областей мира Java.
Основные подходы к сборке мусора – подсчет ссылок (reference counting) и обход графа достижимых объектов (mark-and-sweep, copying collection). Первый подход испытывает трудности с циклическими ссылками, в Java в основном используется второй.
Большинство сборщиков опирается на слабую гипотезу о поколениях. Гипотеза предполагает, что молодые объекты умирают чаще. Для этого куча делится на регионы по времени жизни объектов – поколения. Сборка мусора в них выполняется раздельно.
Общий для большинства сборщиков алгоритм описан во множестве статей, например, в этой. Суть его в том, что достижимые объекты помечаются и группируются, а недостижимые удаляются.
GC Roots – то, с чего начинается обход графа объектов на вопрос достижимости. Множество корневых объектов (root set) считается достижимым безусловно. Часто на интервью просят их перечислить.
Важное понятие для сборщиков мусора – Stop The World пауза. Это полная остановка потоков программы для безопасной сборки мусора и других системных операций. Происходит в специальных местах программы, которые называются safepoint.
Конкретный сборщик в HotSpot указывается в параметре запуска JVM. Каждый сборщик имеет много специфичных для него настроек. В Java 10 HotSpot доступно 4 сборщика:
🔘 Serial – однопоточный, с поколениями. Дает большой throughput (маленькая сумма задержек);
🔘 Parallel – многопоточный вариант Serial;
🔘 CMS (Concurrent Mark-Sweep) – дает меньшую latency (маленькие отдельные паузы), выполняя часть сборки вне Stop The World. Плата за это – меньший throughput. Способ сборки примерно как в предыдущих, работает с поколениями. В Java 9 уже объявлен deprecated;
🔘 G1 (Garbage First) – тоже направлен на уменьшение latency. Вместо поколений оперирует регионами;
🔘 Скоро будет добавлен новый сборщик Shenandoah;
Настоятельно рекомендуется к изучению очередной доклад Шипилёва (с продолжением) и цикл статей на хабре.
#JVM
Очередной вопрос, ответ на который нужно начинать с уточнения: в каком именно сборщике мусора? Понятие сборщика мусора вводится в спецификации JVM, но внутренности зависят от реализации. Одна JVM может содержать несколько сборщиков, один сборщик может применять разные алгоритмы в разных случаях. Вообще говоря, в теории GC может делать ничего. Метод
System.gc()
обещает, что сборщик сделает «лучшую попытку» освободить память, то есть по факту не дает никаких гарантий.GC (garbage collector) – центральная тема шуток про «джава тормозит». Это необходимая плата за стабильное автоматическое управление памятью. Поэтому это одна из самых бурлящих и меняющихся областей мира Java.
Основные подходы к сборке мусора – подсчет ссылок (reference counting) и обход графа достижимых объектов (mark-and-sweep, copying collection). Первый подход испытывает трудности с циклическими ссылками, в Java в основном используется второй.
Большинство сборщиков опирается на слабую гипотезу о поколениях. Гипотеза предполагает, что молодые объекты умирают чаще. Для этого куча делится на регионы по времени жизни объектов – поколения. Сборка мусора в них выполняется раздельно.
Общий для большинства сборщиков алгоритм описан во множестве статей, например, в этой. Суть его в том, что достижимые объекты помечаются и группируются, а недостижимые удаляются.
GC Roots – то, с чего начинается обход графа объектов на вопрос достижимости. Множество корневых объектов (root set) считается достижимым безусловно. Часто на интервью просят их перечислить.
Важное понятие для сборщиков мусора – Stop The World пауза. Это полная остановка потоков программы для безопасной сборки мусора и других системных операций. Происходит в специальных местах программы, которые называются safepoint.
Конкретный сборщик в HotSpot указывается в параметре запуска JVM. Каждый сборщик имеет много специфичных для него настроек. В Java 10 HotSpot доступно 4 сборщика:
🔘 Serial – однопоточный, с поколениями. Дает большой throughput (маленькая сумма задержек);
🔘 Parallel – многопоточный вариант Serial;
🔘 CMS (Concurrent Mark-Sweep) – дает меньшую latency (маленькие отдельные паузы), выполняя часть сборки вне Stop The World. Плата за это – меньший throughput. Способ сборки примерно как в предыдущих, работает с поколениями. В Java 9 уже объявлен deprecated;
🔘 G1 (Garbage First) – тоже направлен на уменьшение latency. Вместо поколений оперирует регионами;
🔘 Скоро будет добавлен новый сборщик Shenandoah;
Настоятельно рекомендуется к изучению очередной доклад Шипилёва (с продолжением) и цикл статей на хабре.
#JVM
👍14🔥3
Почему char[] предпочтительнее String для хранения пароля?
С момента создания строка остаётся в пуле, до тех пор, пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста. В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.
С момента создания строка остаётся в пуле, до тех пор, пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста. В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.
👍22🔥5👎2
Что можно делать с переменной хранящей null?
Во-первых, если переменная не финальная, использовать как L-value этого типа – присваивать новое значение.
Во-вторых, то же, что со значением
🔘 Сравнивать с
🔘 Приводить к типу-родителю (upcast) или типу-наследнику (downcast), учитывая границы generic-параметров при наличии;
🔘 Обращаться к членам экземпляра и получать
🔘 Применять
🔘 Использовать как параметр для методов и других совместимых с типом операторов
В-третьих, можно обращаться к статическим членам класса. В вопросе подразумевается именно эта интересная часть. Это безопасно,
#Классы
Во-первых, если переменная не финальная, использовать как L-value этого типа – присваивать новое значение.
Во-вторых, то же, что со значением
null
, но с учетом типа:🔘 Сравнивать с
null
или переменной этого же класса;🔘 Приводить к типу-родителю (upcast) или типу-наследнику (downcast), учитывая границы generic-параметров при наличии;
🔘 Обращаться к членам экземпляра и получать
NullPointerException
;🔘 Применять
instanceof
и получать false
🔘 Использовать как параметр для методов и других совместимых с типом операторов
В-третьих, можно обращаться к статическим членам класса. В вопросе подразумевается именно эта интересная часть. Это безопасно,
NullPointerException
не возникнет, но для упрощения отладки и из-за отсутствия переопределения статических членов рекомендуется так не делать. Вместо этого обращайтесь к статике явно через имя класса, либо неявно, добавив для класса import static
.#Классы
👍3👎3
Forwarded from Академия Кода
Как вернуть два значения из метода в java?
Вы можете возвращать массив значений из метода.
#java
Подписывайтесь на канал 👉@coddy_academy
Вы можете возвращать массив значений из метода.
class Main {
public static int[] get_summ_and_diff(int x, int y){
int summ = x + y;
int diff = x - y;
return new int[]{summ, diff};
}
public static void main(String[] args) throws Exception {
int[] diff_and_summ = get_summ_and_diff(10, 5);
System.out.println(diff_and_summ[0]);
System.out.println(diff_and_summ[1]);
// Вывод :
// 15
// 5
}
}
#java
Подписывайтесь на канал 👉@coddy_academy
👎15👍7🤬1
Что такое enum?
enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами.
Является
Имеет только заранее заданный набор значений. Значения неявно
Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона
Экземпляры хранят свойства
Финализация и клонирование перечислений запрещены.
#Классы
enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами.
enum Foo
всегда неявно наследуется от Enum<Foo>
– то есть перечислением нельзя расширить другой класс, но всё еще можно реализовать интерфейсы. Из-за generic-параметра разные перечисления не имеют общего предка кроме Object
.Является
Comparable
(сравнивается позиция по порядку объявления значений) и Serializable
(сериализуется только имя константы).Имеет только заранее заданный набор значений. Значения неявно
public static final
и это нельзя переопределить. Для инициализации констант действуют все правила статической инициализации. Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона
enum
. Экземпляры хранят свойства
name
и ordinal
– имя и порядковый номер константы. Статический метод values
вернет список всех констант, valueOf
– константу по имени. Спецификация.Финализация и клонирование перечислений запрещены.
#Классы
👍8
Зачем нужен загрузчик классов?
В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.
Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода
В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace.
#Классы
В Java используется динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса ClassLoader. Кроме того, они же загружают и файлы-ресурсы.
Загрузка класса (точнее любого ссылочного типа) и всех его предков происходит автоматически перед его инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов – ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода
loadClass
бинарное имя класса.В URLClassLoader и стандартных загрузчиках JVM источником класса служит .class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в permgen/metaspace.
Class
может быть выгружен, когда загрузивший его ClassLoader
стал мусором.#Классы
👍7❤1