Расскажите про приведение типов. Что такое понижение и повышение типа?
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.
В Java существуют несколько разновидностей приведения:
• Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.
• Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
• Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
• Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
• Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
• Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.
• Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.
При приведении ссылочных типов с самим объектом ничего не происходит - меняется лишь тип ссылки, через которую происходит обращение к объекту.
Для проверки возможности приведения нужно воспользоваться оператором
👉@BookJava
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.
В Java существуют несколько разновидностей приведения:
• Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.
• Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
• Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
• Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
• Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
• Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.
• Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.
При приведении ссылочных типов с самим объектом ничего не происходит - меняется лишь тип ссылки, через которую происходит обращение к объекту.
Для проверки возможности приведения нужно воспользоваться оператором
instanceof:
Parent parent = new Child();
if (parent instanceof Child) {
Child child = (Child) parent;
}
👉@BookJava
👍7
Где у Java приложения точка входа?
В обычном Java приложении всегда должен быть main class, содержащий метод main. С него начинается исполнение всей программы. Main class-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application.
main обязательно
В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции
Когда приложение запускается как
Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл META-INF/MANIFEST.MF добавляется строчка вида Main-Class: ru.google.com.MyClass. Иначе запуск завершается ошибкой «no main manifest attribute».
В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».
В апплетах вместо main входной точкой служат методы init и start. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.
👉@BookJava
В обычном Java приложении всегда должен быть main class, содержащий метод main. С него начинается исполнение всей программы. Main class-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application.
main обязательно
public static
. Дополнительно, методу разрешено иметь модификатор strictfp. На аннотации и список исключений ограничений не накладывается.В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции
String[] и String
... компилируются в один и тот же байт-код, так что приемлемы оба варианта. Название массива может быть любым, а значение будет содержать аргументы командной строки.Когда приложение запускается как
classpath
, главный класс передается параметром командной строки. Если выполняется единственный исходник, он и описывает main class.Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл META-INF/MANIFEST.MF добавляется строчка вида Main-Class: ru.google.com.MyClass. Иначе запуск завершается ошибкой «no main manifest attribute».
В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».
В апплетах вместо main входной точкой служат методы init и start. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.
👉@BookJava
Telegram
Библиотека Java разработчика
Какие бывают модификаторы?
🔘 Модификаторы доступа private, protected, public (рассмотрим подробнее в разделе #Классы)
🔘 Модификаторы для многопоточности synchronized и volatile (подробнее чуть позже)
🔘 static (рассмотрим подробнее в разделе #Классы)
🔘 final…
🔘 Модификаторы доступа private, protected, public (рассмотрим подробнее в разделе #Классы)
🔘 Модификаторы для многопоточности synchronized и volatile (подробнее чуть позже)
🔘 static (рассмотрим подробнее в разделе #Классы)
🔘 final…
👍5
Java. Сортировки
Java. Сортировка пузырьком.
Java. О сортировке выбором.
Java. Быстрая сортировка. Объяснение на пальцах)
Java. Оценка сложности алгоритмов сортировки.
Java. Сортировка слиянием.
Java. Сортировка подсчетом.
Java. Сортировка вставками.
Java. Сортировка расческой. От пузырька до расчески.
👉@BookJava
Java. Сортировка пузырьком.
Java. О сортировке выбором.
Java. Быстрая сортировка. Объяснение на пальцах)
Java. Оценка сложности алгоритмов сортировки.
Java. Сортировка слиянием.
Java. Сортировка подсчетом.
Java. Сортировка вставками.
Java. Сортировка расческой. От пузырька до расчески.
👉@BookJava
👍13
Бонни и Клайд, зима и Новый год, черное и белое, в конце концов, сметана и пельмени - есть вещи, которые прекрасно сочетаются и дополняют друг друга. Можно сказать, неотделимые друг от друга. В случае с Java-разработчиком это Spring Framework.
Мы, конечно, шутим, но если говорить серьезно, то без уверенного знания этого фреймворка сложно рассчитывать на действительно крутые проекты и серьезные задачи. Почему? Потому что более 90% вакансий Java-разработчика требуют знания Spring Framework. А еще потому что Spring Framework — де-факто стандарт разработки промышленных приложений для языка Java. Кажется, этого уже должно быть достаточно, чтобы изучить самый популярный фреймворк для Java. Но почему-то, нередко junior и middle разработчики пренебрегают этим знанием. Во многих онлайн школах на курсах либо комплексное и долгое обучение Java-разработке с нуля, где лишь поверхностно изучается Spring, либо отдельные курсы по Spring, но на английском языке. Короче, долго или сложно для изучения.
Мы в Слёрме не понаслышке знаем и регулярно видим, как часто разработчики просто машинально используют Spring, даже не вникая в его возможности. Все бы ничего, но когда возникает проблема или не шаблонная задача, они не понимают, куда смотреть и что делать. А что делать? Изучать разные сценарии использования Spring Framework, желательно на практике. А пока ловите экспертное мнение о плюсах и минусах самого популярного Java-фреймворка:
https://habr.com/ru/company/southbridge/blog/698780/
Мы, конечно, шутим, но если говорить серьезно, то без уверенного знания этого фреймворка сложно рассчитывать на действительно крутые проекты и серьезные задачи. Почему? Потому что более 90% вакансий Java-разработчика требуют знания Spring Framework. А еще потому что Spring Framework — де-факто стандарт разработки промышленных приложений для языка Java. Кажется, этого уже должно быть достаточно, чтобы изучить самый популярный фреймворк для Java. Но почему-то, нередко junior и middle разработчики пренебрегают этим знанием. Во многих онлайн школах на курсах либо комплексное и долгое обучение Java-разработке с нуля, где лишь поверхностно изучается Spring, либо отдельные курсы по Spring, но на английском языке. Короче, долго или сложно для изучения.
Мы в Слёрме не понаслышке знаем и регулярно видим, как часто разработчики просто машинально используют Spring, даже не вникая в его возможности. Все бы ничего, но когда возникает проблема или не шаблонная задача, они не понимают, куда смотреть и что делать. А что делать? Изучать разные сценарии использования Spring Framework, желательно на практике. А пока ловите экспертное мнение о плюсах и минусах самого популярного Java-фреймворка:
https://habr.com/ru/company/southbridge/blog/698780/
Хабр
Spring. Экспертное мнение о плюсах и минусах самого популярного Java-фреймворка
Spring является самым популярным инструментом при разработке промышленных приложений на Java – от больших монолитных приложений до микросервисов. Сразу стоит отметить, что под термином Spring мы...
👍8
Что такое функциональный интерфейс?
Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.
Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса
Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).
Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами.
Дополнительно функциональный интерфейс принято помечать аннотацией
Типичные примеры функциональных интерфейсов:
👉@BookJava
Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.
Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса
Object
также игнорируется.Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).
Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами.
Дополнительно функциональный интерфейс принято помечать аннотацией
@FunctionalInterface
. Наличие этой аннотации не необходимо, но оно даёт дополнительную валидацию: её присутствие на нефункциональном типе спровоцирует ошибку компиляции.Типичные примеры функциональных интерфейсов:
Callable, Supplier, Comparable.
👉@BookJava
👍6
Какие некоторые из важных особенностей и преимуществ Spring Framework?
Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.
Spring Framework, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:
• Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
• Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
• Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
• Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.
👉@BookJava
Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.
Spring Framework, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:
• Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
• Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
• Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
• Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.
👉@BookJava
👍6
Java Exception Handling Cheat Sheet
https://javaconceptoftheday.com/java-exception-handling-cheat-sheet/
👉@BookJava
https://javaconceptoftheday.com/java-exception-handling-cheat-sheet/
👉@BookJava
👍2😁1
Как инициализировать переменную функционального интерфейса?
Функциональный интерфейс – всё ещё интерфейс, поэтому остаются доступными стандартные способы. Интерфейс можно реализовать обычным классом, и затем создать его экземпляр оператором
Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение:
2. Ссылка на метод:
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava
Функциональный интерфейс – всё ещё интерфейс, поэтому остаются доступными стандартные способы. Интерфейс можно реализовать обычным классом, и затем создать его экземпляр оператором
new
. Можно совместить эти два действия, и создать экземпляр анонимного класса.Основное преимущество, которое дает функциональный интерфейс – два дополнительных способа инициализации параметров и переменных.
1. Лямбда-выражение:
(x, y) -> x * y
2. Ссылка на метод:
Math::sqrt
На эти способы накладывается небольшое ограничение: тип функционального параметра/переменной должен быть указан явно. Это значит, что лямбдой или метод-референсом нельзя инициализировать переменную, объявленную ключевым словом var. Также, чтобы передать лямбду или референс в параметр generic-типа, этот тип должен быть ограничен функциональным интерфейсом (должен стираться в него).
👉@BookJava
👍6
Какие подклассы класса Reader вы знаете, для чего они предназначены?
👉@BookJava
• Reader
- абстрактный класс, описывающий символьный ввод;• BufferedReader
- буферизованный входной символьный поток;• CharArrayReader
- входной поток, который читает из символьного массива;• FileReader
- входной поток, читающий файл;• FilterReader
- абстрактный класс, предоставляющий интерфейс для классов-надстроек;• InputStreamReader
- входной поток, транслирующий байты в символы;• LineNumberReader
- входной поток, подсчитывающий строки;• PipedReader
- входной канал;• PushbackReader
- входной поток, позволяющий возвращать символы обратно в поток;• StringReader
- входной поток, читающий из строки.👉@BookJava
👍9
Продвинутый Java (от разработчика из JetBrains)
Java. Урок 1. Обзор Java. Лекции от Senior Java-разработчика из JetBrains
Java. Урок 2. Javadoc и наследование
Java. Урок 3. Исключения и обобщенные типы в Java
Java. Урок 4. Коллекции Java и Stream API
Java. Урок 5. Многопоточность. Часть 1
👉@BookJava
Java. Урок 1. Обзор Java. Лекции от Senior Java-разработчика из JetBrains
Java. Урок 2. Javadoc и наследование
Java. Урок 3. Исключения и обобщенные типы в Java
Java. Урок 4. Коллекции Java и Stream API
Java. Урок 5. Многопоточность. Часть 1
👉@BookJava
👍9