Питання та відповіді на інтерв’ю з Android — Частина I

pic

Є низка запитань, які мені задають в багатьох компаніях, і я також підготував їх для своєї підготовки. Ця стаття зосереджена на частині інтерв'ю, пов'язаній з Java.

1) Що таке концепції ООП?

Об'єкт 👉 Будь-яка сутність, яка має стан та поведінку, називається об'єктом. Наприклад, стілець, ручка, стіл, клавіатура, велосипед тощо. Це може бути фізичним чи логічним об'єктом.

Клас 👉 Колекція об'єктів називається класом. Це логічна сутність.
Клас можна також визначити як шаблон, з якого ви можете створювати окремі об'єкти. Клас не займає пам'ять.

Наслідування 👉 Коли один об'єкт набуває всі властивості та поведінку батьківського об'єкта, це називається наслідуванням. Воно забезпечує повторне використання коду. Використовується для досягнення поліморфізму під час виконання.

Поліморфізм 👉 Якщо одна і та ж дія виконується різними способами, це називається поліморфізмом. Наприклад: переконати клієнта по-різному, намалювати що-небудь, наприклад, фігуру, трикутник, прямокутник тощо.

В Java для досягнення поліморфізму ми використовуємо перевантаження та перевизначення методів.
Інший приклад — це говорити щось; наприклад, кіт каже "мяу", собака гавкає "гав" тощо.

Абстракція 👉 Приховування внутрішніх деталей та показ тільки функціональності називається абстракцією. Наприклад, телефонний дзвінок, ми не знаємо внутрішній процес обробки.

В Java для досягнення абстракції використовуються абстрактні класи та інтерфейси.

Інкапсуляція 👉 Об'єднання (або упаковка) коду та даних в одну одиницю називається інкапсуляцією. Наприклад, капсула, вона упаковується з різними ліками.

2) Що таке перевантаження методів?

Якщо в класі є кілька методів з однаковим ім'ям, але різними параметрами, це називається перевантаженням методів.

Якщо потрібно виконати лише одну операцію, використання однакових імен методів підвищує читабельність програми.

3) Що таке перевизначення методів?

Якщо підклас (дочірній клас) має метод, аналогічний методу, оголошеному в батьківському класі, це називається перевизначенням методів в Java.

Іншими словами, якщо підклас надає специфічну реалізацію методу, який був оголошений одним із його батьківських класів, це називається перевизначенням методу.

4) Які типи наслідування існують в Java?

Згідно з класами, в Java є три типи наслідування: одинарне, многоурівневе та ієрархічне.

В Java програмуванні підтримується множинне та гібридне наслідування лише через інтерфейси.

5) Чому в Java не підтримується множинне наслідування?

Щоб зменшити складність та спростити мову, в Java не підтримується множинне наслідування.

Уявіть ситуацію, коли є три класи: A, B та C. Клас C успадковує класи A та B. Якщо в класах A та B є однакові методи і ви викликаєте їх з об'єкта дочірнього класу, виникне неоднозначність у виклику методу з класу A чи B.

6) Що таке абстрактний клас в Java?

Клас, який оголошений як абстрактний, називається абстрактним класом. Він може мати абстрактні та неабстрактні методи. Його потрібно розширювати та реалізовувати його методи. Не можна створювати екземпляри цього класу.

  • Абстрактний клас повинен бути оголошений за допомогою ключового слова abstract.
  • Він може містити абстрактні та неабстрактні методи.
  • Не можна створювати екземпляри абстрактного класу.
  • Він може містити конструктори та статичні методи.
  • Він може мати фінальні методи, що змушують підклас не змінювати тіло методу.

7) Що таке абстракція в Java?

Абстракція — це процес приховування деталей реалізації та показ лише функціональності користувачеві.

Іншим способом це можна описати як показ лише основних аспектів користувачеві і приховування внутрішніх деталей, наприклад, при відправці SMS, де ви вводите текст і відправляєте повідомлення. Ви не знаєте внутрішній процес доставки повідомлення.

Існує два способи досягнення абстракції в Java:

  1. Абстрактний клас (0 до 100%)
    2.
    Interface (100%)

8) Що таке інтерфейс в Java?

Інтерфейс в Java — це шаблон класу. Він містить статичні константи та абстрактні методи.

Інтерфейс в Java є механізмом для досягнення абстракції. В інтерфейсі Java можуть бути лише абстрактні методи, без тіла методу. Він використовується для досягнення абстракції та множинного наслідування в Java.

Іншими словами, можна сказати, що інтерфейси можуть містити абстрактні методи та змінні. Вони не можуть мати тіло методу.

Інтерфейс в Java також відображає відношення IS-A. Інтерфейс не можна інстанціювати, так само як і абстрактний клас.

9) Чому використовувати інтерфейс в Java?

Є три основні причини для використання інтерфейсу.

  1. Він використовується для досягнення абстракції.
  2. Через інтерфейс ми можемо підтримувати функціональність множинного наслідування.
  3. Він може використовуватись для досягнення слабкої зв'язності.

10) Які існують типи модифікаторів доступу в Java?

В Java модифікатори доступу — це ключові слова, які використовуються для визначення області доступу до методу, класу або змінної.

В Java є чотири модифікатори доступу:

Public: Класи, методи або змінні, які визначені як public, можуть бути доступні з будь-якого класу чи методу.

Protected: Модифікатор Protected дозволяє доступ до класу в межах того ж пакету, підкласу цього класу чи всередині самого класу.

Default: Модифікатор Default дозволяє доступ лише в межах пакету. За замовчуванням усі класи, методи та змінні мають дефолтну область видимості.

Private: Клас, методи або змінні, визначені як private, доступні лише в межах самого класу.

11) Що таке конструктор в Java?

Конструктор можна визначити як спеціальний тип методу, який використовується для ініціалізації стану об'єкта. Він викликається, коли клас ініціалізується, і пам'ять виділяється для об'єкта. Кожного разу, коли об'єкт створюється за допомогою ключового слова new, викликається конструктор класу за замовчуванням. Ім'я конструктора повинно бути таким самим, як і ім'я класу. Конструктор не повинен мати явного типу повернення.

Для конструктора визначені такі правила:

  1. Ім'я конструктора повинно бути таким самим, як ім'я класу.
  2. Конструктор не повинен мати явного типу повернення.
  3. Конструктор Java не може бути абстрактним, статичним, фінальним або синхронізованим.

Існують два типи конструкторів в Java:

  1. Конструктор за замовчуванням: Конструктор називається “Конструктором за замовчуванням”, коли він не має жодного параметра.
  2. Параметризований конструктор: Конструктор, який має певну кількість параметрів, називається параметризованим конструктором.

12) Що таке ключове слово this в Java?

У Java ключове слово this є посиланням на поточний об'єкт. Воно використовується для доступу до членів поточного об'єкта.

13) Чи можна використовувати абстрактний та фінальний модифікатори одночасно з методом?

Ні, тому що абстрактний метод потрібно перевизначити для надання його реалізації, в той час як фінальний метод не можна перевизначати.

14) Чи може бути абстрактний метод без абстрактного класу?

Ні, якщо в класі є абстрактний метод, то цей клас повинен бути абстрактним.

15) Чому об'єкти незмінні в Java?

Тому що в Java використовується концепція строкових літералів. Припустимо, є п'ять змінних посилання, які всі вказують на один об'єкт "sachin". Якщо одна змінна змінить значення цього об'єкта, це вплине на всі інші змінні, що на нього вказують.

16) Що таке пул строк?

Пул строк — це область, зарезервована в пам'яті купи, яка може бути використана для зберігання рядків. Основною перевагою використання пулу строк є те, що коли ми створюємо строковий літерал, JVM спочатку перевіряє "пул констант строк". Якщо рядок вже існує в пулі, повертається посилання на екземпляр з пулу. Якщо рядок не існує в пулі, створюється новий екземпляр рядка і додається до пулу.
Тому це економить пам'ять, уникаючи дублювання.

17) Які відмінності між абстрактним класом та інтерфейсом?

18) Які відмінності між String та StringBuffer?

19) Які відмінності між StringBuffer та StringBuilder?

19) Яка різниця між final, finally та finalize?

20) Яка різниця між ArrayList та Vector?

21) Яка різниця між ArrayList та LinkedList?

22) Яка різниця між List та Set?

23) Яка різниця між HashSet та TreeSet?

24) Яка різниця між Set та Map?

25) Яка різниця між HashSet та HashMap?

26) Яка різниця між HashMap та TreeMap?

27) Яка різниця між HashMap та Hashtable?

28) Яка різниця між Map та FlatMap?

29) Яка різниця між Comparable та Comparator?

30) Яка різниця між Serializable та Parcelable?

31) Що таке анонімні класи?

Анонімний клас — це те, що вказує його ім'я: він не має імені. Це поєднує оголошення класу та створення екземпляра класу в один крок.

Приклад:

MyButton.setOnClickListener(new Button.OnClickListener   
{   
@override   
public void onClick(View view){   
//код   
}});

32) Що таке рефлексія?

Рефлексія — це процес дослідження або модифікації поведінки класу під час виконання програми. Клас java.lang.Class надає різноманітні методи, які можна використовувати для отримання метаданих, вивчення та зміни поведінки класу під час виконання. Пакети java.lang та java.lang.reflect надають класи для рефлексії в Java. Вона використовується в:

  • IDE (Інтегроване середовище розробки), наприклад, Eclipse, MyEclipse, NetBeans.
  • Дебагери
  • Інструменти для тестування тощо.

33) Що таке сінглтон-клас в Java?

Сінглтон-клас — це клас, який не може бути інстанційовано більше одного разу. Для того, щоб зробити клас сінглтоном, ми або робимо його конструктор приватним, або використовуємо статичний метод getInstance.

Для створення сінглтон-класу, клас повинен реалізувати такі властивості:

  • Створити приватний конструктор класу, щоб обмежити створення об'єктів за межами класу.
  • Створити приватну атрибут класу, який посилається на один об'єкт.
  • Створити публічний статичний метод, який дозволяє створювати та отримувати доступ до об'єкта, який ми створили.
    Всередині методу ми створимо умову, яка обмежить нас у створенні більше ніж одного об'єкта.
class SingletonExample {  
// приватне поле, яке посилається на об'єкт  
 private static SingletonExample singleObject;  

 private SingletonExample() {  
 // конструктор класу SingletonExample  
 }  
 public static SingletonExample getInstance() {  
 // пишемо код, що дозволяє створити лише один об'єкт  
 // доступ до об'єкта за потребою  
 }  
}

34) Яка різниця між == та методом .equals() в Java?

== операції для порівняння посилань (порівняння адрес)

.equals() метод для порівняння вмісту.

* Простими словами, == перевіряє, чи вказують обидва об'єкти на одну й ту саму адресу пам'яті, тоді як метод .equals() оцінює порівняння значень у об'єктах.

35) Що таке потоки в Java?

Потік (Thread) в Java — це напрямок або шлях, який обирається під час виконання програми.

Концепція багатозадачності

Операційна система надає користувачам можливість багатозадачності, що дозволяє виконувати кілька дій одночасно на машині. Цю багатозадачність можна реалізувати двома способами:

  1. Процесорна багатозадачність: У цьому типі багатозадачності процеси є важкими, і кожному процесу виділяється окрема пам'ять. Оскільки процеси важкі, вартість зв'язку між процесами висока, і перемикання між процесами займає багато часу, оскільки воно включає в себе такі дії, як завантаження, збереження в регістри, оновлення мап, списків тощо.
  2. Потокова багатозадачність: Потоки є легкими, і вони ділять одну і ту ж адресну область, тому вартість комунікації між потоками також низька.

Життєвий цикл потоку

Потік проходить різні стани протягом свого життєвого циклу, давайте розглянемо ці стани:

  1. Новий стан
  2. Активний стан
  3. Стан очікування/блокування
  4. Стан очікування з таймером
  5. Завершений стан

pic

Життєвий цикл потоків

1. Новий стан

За замовчуванням, потік буде в новому стані, у цьому стані код ще не виконано і процес виконання ще не розпочато.

2. Активний стан

Потік, який за замовчуванням знаходиться в новому стані, переходить в активний стан, коли викликається метод start(). Цей активний стан містить два підстани:

  • Стан готовності до виконання (Runnable State): У цьому стані потік готовий виконуватись у будь-який час, і завдання планувальника потоків — надати потоку час для виконання збережених потоків у стані готовності. Програма, яка використовує багатозадачність, розподіляє інтервали часу між потоками, тому ці потоки виконуються деякий час і чекають у стані готовності до виконання, поки не отримають свій черговий інтервал часу.
  • Виконуваний стан (Running State): Коли потік отримує доступ до процесора через планувальник потоків, він переходить з "Стану готовності" до "Виконуваного" стану. Після завершення свого відведеного часу потік повертається до "Стану готовності" і чекає на свій наступний час.

3. Стан очікування/блокування

Якщо потік неактивний, але тимчасово, то він знаходиться в стані очікування або блокування. Наприклад, якщо існують два потоки, T1 і T2, і T1 потребує взаємодії з камерою, а T2 вже використовує її, щоб зробити сканування, то T1 чекає, поки T2 завершить свою роботу. У цей час T1 знаходиться в стані очікування, а в іншому випадку, якщо два потоки T2 і T3 мають однакову функціональність і їм обом надано однаковий час для виконання, то обидва потоки T1 і T2 будуть у стані блокування. Коли є кілька потоків, що перебувають у стані блокування/очікування, планувальник потоків очищає чергу, відкидаючи непотрібні потоки і виділяючи процесор за пріоритетом.
Стан очікування з таймером

Іноді довге очікування потоків призводить до голодування. Наприклад, є два потоки T1 і T2, які чекають на процесор, а T1 виконує критичну операцію коду. Якщо T1 не отримає доступ до процесора, поки не завершиться його операція, то T2 буде змушений чекати значно довше, і невідомо, скільки часу це може зайняти. Щоб уникнути такої ситуації голодування, використовується стан очікування з таймером (Timed Waiting), при якому кожен потік має певний період часу, протягом якого викликається метод sleep(). По закінченню цього часу потік починає виконувати свою задачу.

5. Завершений стан

Потік буде перебувати в стані завершення через такі причини:

  • Завершення досягається потоком, коли він завершує своє завдання нормально.
  • Іноді потоки можуть бути завершені через незвичні події, такі як сегментаційні помилки, винятки тощо. Таке завершення називається ненормальним завершенням.
  • Завершений потік означає, що він "мертвий" і більше не доступний.

Дякую за увагу. 🙌🙏✌.

Чи було це корисно? Не забудьте поставити "плескання" 👏 і підписатися на мене для більше корисних статей з Android-розробки та Kotlin, або пригостити нас кавою тут

Якщо вам потрібна допомога з Android або Kotlin, я завжди радий допомогти.

Слідкуйте за мною на:

LinkedIn, Github, Instagram & WhatsApp

Перекладено з: Android Interview Questions Answer — Part I

Leave a Reply

Your email address will not be published. Required fields are marked *