Вопросы на собеседование
- В чем отличие Data Class от обычного класса?
В Data классе переопределяется:
- toString
- equals
- hashCode
- Переопределены деструктивные операторы (component1(), component2()...)
- Переопределен метод copy()
Можно использовать деструктор.
Если не укажем, что это дата класс, то деструктор не получится вызвать, т.к. необходимо чтобы в классе были переопределены методы "component 1" 2 и т.д. Их может быть сколько угодно. И в принципе можем переопределить сами.
class Student(val name: String, val lastName: String, val id: String) { operator fun component1() = name operator fun component2() = lastName operator fun component3() = id }
operator означает, что это не наша функция, а функция, которая нужна для деструктора.
2. Как работает == и equals?
== сравнивает ссылки объектов
equals сравнивает параметры объекта
Но equals для начала нужно переопределить и указать по каким параметром будет проводиться проверка. Обычно проверяются 3 условия:
- Сравнивается ссылка на объект - если она одинаковая, то это точно один объект
- Сравниваются хэш коды. Если они не равны, то это точно разные объекты
- Сравниваются значения класса по отдельности.
В идее можно автоматически всё это сгенерировать.
3. Модификаторы доступа в Kotlin
private - поля, методы и классы объявленные как private будут доступны только внутри класса. Особенность Kotlin - можно объявлять переменные в файле. Тогда переменная будет доступна только внутри файла. Private - объявленный только внутри класса - доступен внутри класса, а внутри файла - только внутри файла.
public - все методы и поля доступны в любом месте программа. Установлен по умолчанию и указывать его не нужно.
protected - доступен внутри классов, но таже и изнутри классов наследников
internal - видимость внутри одного модуля
4. Классы: вложенный и внутренний классы.
Внутренний класс всегда содержит ссылку на внешний. Для создания требует экземпляр внешнего класса, следовательно у него должна быть ссылка на внешний класс.
Вложенный класс не содержит ссылку на внешний класс. Используется как хелпер класс для внешнего. Не хранит никакого экземпляра для внешнего класса.
В Котлине классы всегда вложены. Надо указывать вручную если класс внутренний.
class Outer { //Внешний class Nested { //Вложенный } inner class Internal() { //Внутренний fun getOuter(): Outer = this@Outer } } fun main() { val outer = Outer() val nested = Outer.Nested() val internal = outer.Internal() }
Уточнить для чего это вообще нужно?
5. Как работают Extension функции?
Что происходит под капотом когда мы написали функцию и нажали на build?
6. Singleton
Когда будут проинициализированы поля?
Пока к классу не обратились - поля не будут проинициализированы
7. Что ты используешь из всех возможностей Kotlin?
Элвис
Null Safety
Перегрузка операторов
Оператор Use (автоматом закрывает потоки)
8. В чем разница между Launch методом и Awayt методом?
Разница в том, что они возвращают
Launch возвращает job который можно заканцелить. Джоуб
Await отдает деферт и разница в этом.
ЭТО КОРУТИНЫ