Всім привіт, сьогодні я продовжую розбір 250+ питань із співбесід на Java-розробника. Попередні частини розбору: перша , друга , третя . Отже, продовжимо.
<ім'я класу>{спадкування від класу Батька} {реалізація інтерфейсів}
Отже, що ми маємо: {модифікатор доступу класу} — для класу доступні лише модифікатори public та відсутній модифікатор доступу, тобто default . {Статичність класу} - static - модифікатор, який вказує, що даний клас статичний, застосовний тільки до внутрішніх класів (класів всередині інших класів). {Фінальність класу} - як ми пам'ятаємо, це модифікатор final , за наявності якого клас стає не успадкованим (приклад з коробки - String ). {абстрактність класу} – модифікатор – abstractщо вказує на те, що цей клас може мати нереалізовані методи. Цей модифікатор конфліктує з модифікатором final , тобто в заголовку класу може бути тільки один з них, оскільки модифікатор abstract передбачає, що цей клас буде успадкований і буде реалізовано його абстрактні частини. А final вказує на те, що це фінальна (остаточна) версія класу, і успадкований він не може бути. Власне, одночасне використання обох модифікаторів буде абсурдним і компілятор не дасть нам цього зробити. <class> - ключове обов'язкове слово, яке свідчить про оголошення класу. <ім'я класу>- Просте ім'я класу, яке є ідентифікатором конкретного класу Java. Повне ім'я класу складається з повного імені пакета + . + Просте ім'я класу. {успадкування від класу Батька} — вказівка класу батька (якщо є) за допомогою ключового слова extends . Наприклад, .. extends ParentClass . {Реалізація інтерфейсів} - вказівка інтерфейсів, які даний клас реалізує (якщо вони є) за допомогою ключового слова implements . Наприклад: … implements FirstInterface, SecondInterface … Ну і як приклад заголовка класу розглянемо заголовок класу Lion , який успадковується від Catі реалізує інтерфейс WildAnimal :
29. Чи можна у конструкторі використовувати return?
Можна, але без значення, що повертається праворуч від return . Тобто можна використовувати return; як допоміжну конструкцію при обчисленнях у конструкторі, щоб терміново закінчити (перервати) виконання подальшого коду та завершити ініціалізацію об'єкта. Наприклад, у нас є клас Cat , і якщо Cat бездомний - isHomeless = true , нам потрібно закінчити ініціалізацію і не заповнювати інші поля (адже вони нам невідомі, оскільки котик бездомний):public Cat(int age, String name, boolean isHomeless) {
if (isHomeless){
this.isHomeless = isHomeless;
return;
}
this.isHomeless = isHomeless;
this.age = age;
this.name = name;
}
Але якщо говорити про конкретні значення, конструктор не може використовувати return для повернення якогось значення, тому що:
- при оголошенні конструктора у вас не буде нічого схожого на тип, що повертається;
- як правило, конструктор неявно викликається під час створення екземпляра;
- конструктор — це не метод: це окремий механізм, єдина мета якого — ініціалізувати змінні екземпляри, а саме створенням об'єкта займається оператором new .
30. Чи можна з конструктора залишити виняток?
З винятками конструктори працюють так само, як і методи. І якщо методи дозволяють нам прокидати винятки, прописуючи в заголовку методу throws <ТипВиключення> , то і конструктор дозволяє нам це робити, і так само при наслідуванні та визначенні конструктора спадкоємця ми можемо розширювати тип виключення. Наприклад, IOException -> Exception (але не навпаки). Як приклад для прокидання конструктором виключення візьмемо клас Cat . Припустимо, при його створенні ми хочемо вводити ім'я та вік із консолі:public Cat() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
this.name = reader.readLine();
this.age = Integer.parseInt(reader.readLine());
}
Так як reader.readLine() кидає виняток IOException, в заголовку ми його прописуємо як можливий виняток, що викидається.
31. З яких елементів складається заголовок класу? Напишіть приклад
Говорячи про елементи, що становлять заголовок класу, розглянемо невелику схему:- обов'язкові складові будуть у дужках <>
- необов'язкові - в {}
public final class Lion extends Cat implements WildAnimal
32. З яких елементів складається заголовок методу? Напишіть приклад
Знову ж таки, при розгляді елементів, з яких складається заголовок методу, розглянемо невелику схему, в якій:- обов'язкові складові - у дужках <>
- необов'язкові - в {}
public static void main(String[] args) throws IOException
33. Створіть в об'єкті-спадкоємці конструктор за умовчанням, якщо у базовому він не визначений (але визначено іншого конструктора)
Я не до кінця розумію саме питання, але можливо мається на увазі, що, наприклад, у батька у нас є якийсь кастомний конструктор:public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Тому в класі предку нам обов'язково потрібно визначити конструктор, який заповнюватиме (викликатиме) батьківський конструктор:
public class Lion extends Cat {
public Lion(int age, String name) {
super(age, name);
}
}
34. Коли використовується ключове слово this?
У Java цевикористовується в двох різних значеннях. 1. Як посилання на поточний об'єкт типу this.age = 9 . Тобто this посилається на об'єкт, в якому була викликана і до якого відноситься код, який використовує this . Головна функція – підвищити читабельність коду та уникнути неоднозначності. Наприклад, при однаковому імені внутрішнього поля класу та аргументу методу:public void setName(String name) {
this.name = name;
}
Тобто, this.name – поле об'єкта name – аргумент методу Посилання this не може використовуватись у статичних методах. 2. this можна застосовувати у конструкторі у вигляді виклику методу, типу this(value) . У такому разі це буде виклик іншого конструктора цього класу. Словом, можна викликати відразу два конструктори під час створення об'єкта:
public Cat(int age, String name) {
this(name);
this.age = age;
}
public Cat(String name) {
this.name = name;
}
При створенні об'єкта Cat та викликі першого конструктора будуть викликані обидва поля об'єкта та успішно проініціалізовані. Є пара нюансів:
- this() працює лише у конструкторі.
- Посилання на інший конструктор має знаходитись у першому рядку блоку (тіла) конструктора. Тому в одному конструкторі більше одного (іншого) конструктора цього класу викликати не можна.
35. Що таке ініціалізатор?
Наскільки я розумію, у цьому питанні йдеться про звичайні та статистичні блоки ініціалізації. Спочатку давайте згадаємо, що таке ініціалізація. Ініціалізація - це створення, активація, підготовка до роботи, визначення параметрів. Приведення програми або компонента до готовності до використання. Як ви пам'ятаєте, під час створення об'єкта змінну класу можна ініціалізувати безпосередньо при оголошенні:class Cat {
private int age = 9;
private String name = "Tom";
Або задавати ззовні через конструктор:
class Cat {
private int age;
private String name;
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Але є ще один спосіб: задавати внутрішню змінну об'єкта через блок ініціалізації, який має вигляд фігурних дужок { } усередині класу, без імені (як у методу чи конструктора):
class Cat {
private int age;
private String name;
{
age = 10;
name = "Tom";
}
Тобто блок ініціалізації – це частина коду, яка завантажується під час створення об'єкта. Як правило, такі блоки використовуються для виконання деяких складних обчислень, які необхідні при завантаженні класу. Результати цих обчислень можна задавати як значення змінних. Крім звичайних блоків ініціалізації існують статичні, які виглядають так само, але перед фігурною дужкою мають ключове слово static :
class Cat {
private static int age;
private static String name;
static{
age = 10;
name = "Tom";
}
Цей блок такий самий, як і попередній. Але якщо стандартний спрацьовує при ініціалізації кожного об'єкта, то статичний відпрацює лише одного разу, при завантаженні класу. У такому блоці, як правило, також роблять деякі складні обчислення для подальшої ініціалізації статичних змінних класу. Для статичного блоку діють самі обмеження, як і статичних методів: у ньому не можна використовувати не статичні дані, як і посилання поточний об'єкт — this . Далі ми з вами можемо побачити порядок ініціалізації класу (разом із його предком) для кращого розуміння моменту, коли спрацьовують блоки ініціалізації.
36. Для наслідування класу public class Child extends Parent напишіть порядок ініціалізації об'єкта
При завантаженні класу Child буде наступний порядок ініціалізації:- Статичні поля класу Parent .
- Статичний блок ініціалізації класу Parent .
- Статичні поля класу Сhild .
- Статичний блок ініціалізації класу Child .
- Чи не статичні поля класу Parent .
- Чи не статичний блок ініціалізації класу Parent .
- Конструктор класу Parent .
- Чи не статичні поля класу Сhild .
- Чи не статичний блок ініціалізації класу Сhild .
- Конструктор класу Сhild .
37. Які знаєте стосунки між класами (об'єктами)?
Між класами в Java є два види відносин:- відносини IS-A
Lion IS-A Cat
(Але не всякий Cat є Lion -ом) Точно така ж ситуація з інтерфейсами. Якщо клас Lion реалізує інтерфейс WildAnimal , то вони також стосуються:
Lion IS-A WildAnimal
- відносини HAS-A
Car HAS-A Passenger
І навпаки: якщо Passenger має посилання на Car , то це буде відношення:
Passenger HAS-A Car
38. Які асоціативні зв'язки між об'єктами ви знаєте?
Агрегація та композиція — не що інше, як окремі випадки асоціації. Агрегація - відношення, коли один об'єкт є частиною іншого. Наприклад, пасажир може перебувати у машині. Також пасажирів може бути кілька або не бути зовсім (якщо ми говоримо про теслу, то водій не обов'язковий). Наприклад:public class Car {
private List passengers = new ArrayList<>();
void setPassenger(Passenger passenger) {
passengers.add(passenger);
}
void move() {
for (Passenger passenger : passengers) {
System.out.println("Перевозка пассажира - " + passenger.toString());
}
passengers.clear();
}
}
Тобто нам не важлива кількість пасажирів (і чи є вони взагалі): від цього функціонал класу Car не залежить. Також агрегація передбачає, що з використанні об'єкта іншим об'єктом перший можна використовувати ще інших об'єктах. Наприклад, один і той же студент може входити і в гурток в'язання, і в музичну групу рокерів, і при цьому ходити до групи англійських, що вивчають. Як ви зрозуміли, агрегація — це вільніші асоціативні відносини класів. Композиція — ще жорсткіше ставлення, коли об'єкт як є частиною іншого об'єкта, а й робота іншого об'єкта залежить від першого. Наприклад, двигун у машини. Хоч двигун і може бути без машини, але поза ним він некорисний. Та й машина не може працювати без двигуна:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void startMoving() {
engine.start();
...
}
Також композиція передбачає, що з використанні об'єкта іншим об'єктом перший неспроможна належати комусь іншому. Якщо повернутись до нашого прикладу, двигун може належати лише одній машині, але ніяк не двом або більше одночасно. На цьому сьогодні, мабуть, і зробимо зупинку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ