Java

Можно ли переопределить статический метод?

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

Для чего нужно ключевое слово super?

super можно использовать для того чтобы: Указать нижнюю границу для дженерика, это можно сделать так: Consumer<? super Number>; С помощью super можно обратиться к перекрытым локальным переменным или методам родительского класса, например: int shadowedFoo = super. ShadowedFoo; Он позволяет запустить конструктор родительского класса в исходном: SubClass() { super(«parent constructor»); }; Если два или больше реализуемых […]
Читать полностью

Что можно импортировать статически?

Простой импорт позволяет не задавать полное имя используемого класса, то есть пакет писать не обязательно. Статический импорт позволяет делать то же, но для static членов требуемого класса. Обычно он нужен для использования константных интерфейсов, а также для включения static методов. Однако его можно применять для использования статических полей обычных классов. Для nested классов можно применять […]
Читать полностью

Как инициализировать переменную ФИ?

Реализация выполняется уже известными способами, действующими для всех интерфейсов: через простой класс и создание его экземпляра, с помощью метода new, можно также объявить экземпляр, принадлежащий анонимному Java-классу. Для ФИ также доступны нестандартные варианты инициализации: Используя лямбда, например, так: (x, y) -> x * y; С помощью ссылки на существующий метод, например: Math::sin. Но при этом […]
Читать полностью

Что такое функциональный интерфейс?

Функциональный интерфейс – это разновидность интерфейса, в котором определена функция обратного вызова (callback). В функциональном интерфейсе может быть всего один абстрактный метод, в нём может находиться неограниченное число методов default, а также переобъявленные методы, наследуемые от Object. Функциональный метод может иметь неограниченное количество аргументов. На тип возвращаемого значения также и список возможных исключений (как проверяемых, […]
Читать полностью

В чем разница между JavaEE, JavaSE и JavaME?

Язык Java, в пределах каждой выпускаемой версии, практически идентичен, но есть модификации:  Standard Edtion (SE) – базовый набор операций;  Enterprise Edtion (EE) – в эту версию входят дополнительные инструменты для разработки корпоративных серверных приложений и web-технологий; Micro Edtion (ME) – для приложений, работающих на железе с ограниченными вычислительными ресурсами, например, Raspberry PI, смарт ТВ, старых […]
Читать полностью

Чем отличается Closeable от AutoCloseable?

Интерфейс AutoCloseable появился в седьмой версии Java. Он представляет собой объект, предназначенный для хранения какого-либо ресурса до тех пор, пока он открыт. Он имеет только один метод close(), в котором прописаны команды, выполняемые при закрытии ранее задействованного ресурса. Особенностью данного интерфейса является возможность употреблять его в конструкции, состоящей из блоков try – wth – resource. […]
Читать полностью

Можно ли поймать Error?

Теоретически Error, как и все другие исключения, относящиеся к Throwable, перехватываются в catch. Код в нём должен быть валидным и компилироваться без ошибок. Error, а также все его подклассы возникают во время выполнения, они являются нестандартными, которые в обычных условиях не должны возникать. То есть, Error и его подклассы – это непроверяемые, в обычных условиях […]
Читать полностью

Как скопировать массив?

Перечислим основные методы: Object.clone() копирует массив полностью, не имеет никаких аргументов; System.arraycopy() переносит данные из одного массива, начиная с заданной позиции в целевой массив (вставка начинается с заданной позиции); Arrays.copyOf() копирует исходный массив, усекая его или дополняя нулями, чтобы копия имела заданную длину; Arrays.copyOfRange() записывает часть исходного массива, от начального до конечного индекса, в новый. […]
Читать полностью

Что значит ArrayStoreExceptіon?

ArrayStoreExcepton может появиться при попытке добавить в массив переменную недопустимого типа. Осуществить это можно, так как массивы ковариантны. Поэтому они могут использовать массивы того же типа, что и их родители. Используя операцию приведения к классу Object[] можно попробовать добавить любой объект в исходный массив. Однако, язык Java гарантирует, что любой элемент хранящийся в массиве, имеет […]
Читать полностью

Что будет если блок finally выбросит ошибку?

Как известно, последовательность операций, записанная finally, должна выполняется в любом случае, независимо от того появлялась ли ошибка в try. Если ошибки в try не возникало, то при появлении его в finally оно пойдёт по стеку исключений, до тех пор, пока не придёт в catch. Более интересен случай, когда исключение было в try, а потом возникло […]
Читать полностью

Как в лямбде изменить внешнюю локальную переменную?

Изменить локальную переменную, в ламбде, стандартными методами невозможно, потому, что локальная переменная должны быть effectively final, то есть не должна изменяться после объявления. Это сделано потому что локальная переменная помещается в стек, поэтому её время жизни ограничено скоупом. Однако экземпляр лямбды, который захватил данную переменную, может передать её наружу и использовать в другом потоке или […]
Читать полностью

Как объявить переменное количество аргументов метода?

Для передачи в метод переменного количества аргументов, применяют массив, в котором будет храниться нужное количество переменных. В Java 5 появилась конструкция vararg. В этом случае между типом аргумента произвольной длинны и её именем требуется поставить три точки (…), и можно передавать произвольное количество данных, без предварительной упаковки их в передаваемый массив. Для компилятора оба эти […]
Читать полностью

Чем анонимный внутренний класс отличается от лямбды?

Лямбда выражения, используемые в языке Java, считаются синтаксическим сахаром и отличаются легковесным синтаксисом. При их применении не требуется задавать тип реализуемого функционального интерфейса, его компилятор определяет из контекста. У анонимного внутреннего класса могут быть поля, и можно менять их значение и класс сберегает состояние этих полей между двумя вызовами. Для лямбда-выражения доступен только захват и […]
Читать полностью

Как работает вывод типов?

Выводом типов, в языке Java, называется функция компилятора определять вместо вас требуемый тип. Чтобы успешно пройти интервью требуется знать, что определение нужного типа осуществляется на основании знания параметров передаваемых аргументов и выдаваемого результата. diamond operator <> впервые был введён в седьмой версии языка Java. Он применяется к конструкторам классов Generics классов. В девятой версии diamond […]
Читать полностью

Что такое ковариантность и контравариантность?

Ковариантность – следование существующей иерархии (последовательности) наследования. Например, если класс Dog наследник Animal, то IEnumerble <Dog> будет потомком IEnumerble <Animal>. Перечисление собак – отдельный случай перечисления всех животных. Контравариантность – это изменение порядка наследования на противоположную. Рассмотрим следующий вариант. String является наследником Object. Делегат Action<T> это метод, который принимает объекты типа Т. Тогда Action<Object> – […]
Читать полностью

Как узнать, является ли A подтипом B?

В языке Java существует три способа, которыми можно проверить совместимость типов. Во-первых, с помощью оператора instanceof. В нем в качестве первого аргумента передаётся экземпляр класса А, второй аргумент имя проверяемого класса В. Если экземпляр А не принадлежит к цепочке наследования класса В, то А не считается подтипом В и компилятор выдаст сообщение «inconvertible types». Это […]
Читать полностью

Перечислите целочисленные битовые операторы

Основные битовые операторы: & – операция побитовое И; | – операция побитовое ИЛИ; ^ – операция побитовое исключающее ИЛИ. У этой операции есть следующие особенности: при применении его к одному числу вторично, с тем же параметром, возвращает первоначальное значение числа. Также с его помощью можно произвести обмен значений двух переменных, не вводя третью и без […]
Читать полностью

Что такое короткое замыкание логического оператора?

Операторы И (&&) и ИЛИ (||) выполняются слева направо, то есть, если при последовательном вычислении, левая часть оператора И (&&) окажется равной false, то правая часть выполняться не будет, так как всё равно в результате получиться false. То же самое если левая части оператора ИЛИ (||) будет равна true, независимо от правой части результат предрешён […]
Читать полностью

В каком порядке указываются модификаторы?

При размещении модификаторов полей нужно соблюдать следующие правила: модификатор можно указывать только один раз; одновременно можно указывать только один модификатор доступа. В общем случае, записывать модификаторы можно в произвольном порядке. Но рекомендуется сначала указывать модификаторы @аннотации, потом доступа, далее static, final, transent, volatile. Для модификаторов, используемых с методами, требуется соблюдать такие правила: все те же […]
Читать полностью

Kotlin-практикум с Иваном Ветровым

Запишись бесплатно и получи приглашение на персональную работу

Бесплатная предзапись

Места заполнены. Следующий поток через 3 дня

  • Персональная работа с Иваном Ветровым 10 дней
  • 25 задач с персональным код-ревью
  • Настройка профессиональных инструментов
  • 3 проекта для портфолио + рекомендации
Подробнее про Onboarding
Специальное предложение - изучение Android разработки со скидкой