Java

Как происходит наследование если оба реализуемых интерфейса объявляют один и тот же метод?

В том случае, когда объявления полностью идентичны, в класс, реализующий эти интерфейсы определяет требуемый метод. В том случае, если методы возвращают разные типы, тот все зависит от самих типов. Как известно, начиная с 5 версии Java переопределение ковариантно по отношению к типу возвращаемого значения. Таким образом, в наследнике тип выдаваемого результата может являться наследником. Например, […]
Читать полностью

Как поменять значение приватного finall поля на другое

В первую очередь нужно знать, что такое действие слишком плохая практика, противоречащая принципу сокрытия информации. Для того чтобы это сделать нужно обратиться к Reflection API. Для этого нужно: ·        чтобы получить дескриптор нужного поля, вызываем метод getDeclaredField() у метакласса Class<X>, относящемуся к нужному нам классу; ·        сделать полученный нами […]
Читать полностью

Что такое Reflection?

Reflection – это инструмент метапрограммирования, который даёт средства, с помощью которых можно манипулировать данными, зная структуру конкретного класса, к которым эта информация относятся. Class<T> является входом в рефлексию. В экземплярах данного класса содержится информация о требуемом классе. Имеющиеся способы получить Class: ·        с помощью литерала .class; ·        используя метод […]
Читать полностью

В каком случае результатом выполнения Class.getClassLoader будет null?

Чтобы ответить на этот вопрос нужно разобраться в двух темах. Во-первых, экземпляры, относящиеся к Class<T>, являются описанием типов, где считается что перечисления – это классы, а аннотации идентичны интерфейсам. Экземпляры, принадлежащие Class<T> хранят, в основном, ту же информацию, что и файл class и создаются исключительно внутри загрузчика. Во-вторых, следует рассмотреть особенности метакласса Class<T> для примитивных […]
Читать полностью

Как создаётся экземпляр класса?

На первом этапе загружается сам класс, вместе со своими предками. Класс загружается всего раз, во время 1-го упоминания данного класса. Когда загрузка закончится, начинается процесс выделения памяти под имеющиеся в нём static поля и начинают выполняться команды, прописанные в static блоках инициализации. После этого инициализируется экземпляр. Это происходит по следующей схеме: в куче создаётся ссылка […]
Читать полностью

Зачем нужен тип enum?

Enum является классом со всеми свойствами финального, у которого имеются поля, объявленные по умолчанию как final и экземпляры, также финальные. Им нельзя расширять классы, но с его помощью можно реализовывать интерфейсы. Перечисление Enum является сравнимым (Comparable) и сериализируемым (Serializable). В Enum задаётся набор определённых значений. Все они неявно, по умолчанию определены как public и static, […]
Читать полностью

Какие модификаторы доступа есть в языке Java?

В Java их четыре: public – отсутствуют ограничения на доступ; protected – предоставляет доступ из классов, входящих в пакет и из всех наследников; private – доступ возможен только из исходного класса и внутренний или вложенных в него классов; pakage-private – доступ по умолчанию, применяется когда модификатор не указан явно. Предоставляет доступ для всех классов, входящих […]
Читать полностью

Для чего используется модификатор static?

С помощью данного ключевого слова можно объявить static методы, импорты, поля, инициализационные статические блоки, а также вложенные классы. К static полям и методам класса есть обращаются используя имя класса, потому что, поля и методы являются членами класса, в котором прописаны, а не членами его экземпляров. Нужно учитывать, что поля, заданные со static, не могут принимать […]
Читать полностью

Что делают загрузчики классов?

В языке Java применяется динамический тип загрузки используемых классов, которую выполняют лоадеры (они же загрузчики). Они происходят от класса ClassLoader, который является абстрактным. Также они отвечают за загрузку прочих файлов, в которых содержаться ресурсы. Загрузка элементов ссылочного типа, в том числе классов, вместе с их потомками, выполняется в автоматическом режиме, непосредственно перед их инициализацией. Применяется […]
Читать полностью

Какие примитивные типы предусмотрены в языке Java?

Всего в Java предусмотрено 8 примитивных типов данных, это: byte – целое лежащее в диапазоне от 2^7 до 2^7-1; short – целое лежащее в диапазоне от 2^15 до 2^15-1; с– целое лежащее в диапазоне от 2^31 до 2^31-1; long– целое лежащее в диапазоне от 2^63 до 2^63-1; float – число с плавающей точкой, записанное в […]
Читать полностью

Лишает ли var строгой типизации?

Слово var впервые появилось было введено в десятой версии Java. Оно указывает, что тип переменной определяется при компиляции, в зависимости от того, чем данная переменная будет проинициализирована. Из этого следует что: var можно использовать только для локальных переменных; они нуждаются в инициализации с использованием понятных типов, попытка применить var x; и var x = null; […]
Читать полностью

Отличаются ли сокращенные и обычные операторы?

К сокращенным или как их официально называют операторам сложного присваивания относятся, например, *= или |=. При их применении нужно учитывать один нюанс. Оператор x *= y эквивалентен x = (XType)(x + y). Таким образом при выполнении этих операторов происходит неявное приведение типов, к левому оператору.
Читать полностью

Какие бывают проблемы с арифметикой в Java?

Числа относятся к примитивным типам, поэтому они занимают в памяти определённое, не безграничное пространство, что накладывает ограничения на диапазон значений. Если в результате выполнения математической операции получится число, выходящее за эти пределы, то возникает ошибка переполнения. В этом случае помогут методы с суффиксом *Exact, находящиеся в стандартном классе Math. В этом случае при переполнении появится […]
Читать полностью

Как сравнивать элементы перечисления?

Компилятор преобразует экземпляры enum в static константы, которые к тому же являются singleton-ами. Поэтому, для сравнения можно использовать «==». Все классы наследуются от java.lang.Enum. При этом все методы, кроме toStrng являются финальными. Поэтому, функция equals, также подходит для сравнения перечислений. Но, проще использовать оператор «==», так как: Чтобы не появилась ошибка NullPointerException, нужно удостовериться, что […]
Читать полностью

Может ли название класса не совпадать с названием файла?

В файле *java должен находиться единственный главный публичный класс, при этом его название обязано быть тем же что и у файла, в котором он расположен. Классов, определённых как protected и private не существует. Но на package-protected class приведенное выше правило не действует. Поэтому, для класса у которого не приведены модификаторы доступа разрешено использовать любое название. […]
Читать полностью

Как обойти коллекцию?

Существуют следующие способы: С помощью циклов for или while. В этом случае индексная переменная увеличивается от 0 до размера коллекции, определить который можно с помощью функции size(). В этом случае можно организовать неполный обход или обход с не стандартным шагом. Но в этом случае легко ошибиться с индексами. Этот способ требует написания достаточно большого количества […]
Читать полностью

Что будет со ссылкой на метод, если заменить объект-владельца?

Чтобы ответить на данный вопрос требуется знать, что такое ссылки и что такое ссылки на метод. Если метод обычный, не статический, то для него применяется позднее связывание. При обращении к данному методу по указанной ссылке мы получаем нужный метод. В примере, приведённом ниже, метод, определённый в классе А не используется. Чтобы не запутаться в связывании, […]
Читать полностью

Когда нужно использовать raw types?

Как известно, raw type – это такие generic-типы, которые используются без задания типа-параметра. Данная конструкция допустима, но часто приводит к появлению warning от компилятора. Это связано с риском возникновения ситуации, которая называется heap pollution, это когда переменная, относящаяся к параметризированному типу, начинает ссылаться на непараметризированный объект. Применение raw type, в общем случае, недопустимо. Их поддержка […]
Читать полностью

В чем различие между приватным конструктором и финальным классом?

Если установить модификатор видимости для конструктора класса private, то его нельзя будет запустить из класса наследника, а это означает что наследование станет невозможным. Эту возможность обычно используют для создания утилитарных классов и в паттерне singleton. Модификатор final запрещает наследование от исходного класса. Таким образом ограничение с использованием модификатора private слабее, чем через модификатор final. Его […]
Читать полностью

Как ведут себя конфликтующие импорты?

Классы, входящие в текущий используемый пакет можно использовать без импорта. При импорте class, идентичного по имени с соседним по пакету, он будет перекрыт. В таком случае будет использоваться импортированный class, при этом никакой ошибки компилятор не выдаст. Если в одном классе будет присутствовать некоторое количество классов с идентичными названиями при компиляции возникнет ошибка. Если импортировать […]
Читать полностью

Этими инструментами пользуются 99% разработчиков. Вы научитесь их использовать.

Изучайте программирование в условиях, максимально приближенных к реальной практике.

Узнайте что такое результативное обучение всего за:
1 590₽ 3 000₽

Гарантия возврата денежных средств в случае отсутствия результата

  • 10 дней менторства с действующим программистом и педагогом
  • 25 задач по основам Kotlin
  • Реальные инструменты разработчика
  • Гайд по созданию парсеров для сайтов в подарок
Подробнее про Onboarding