Внутрішні та вкладені класи/Успадкування

Прокрутити вниз


Внутрішні та вкладені класи, а також успадкування — це важливі концепції в Java, які використовуються для організації коду та реалізації об’єктно-орієнтованих принципів.

1. Внутрішні та вкладені класи

У Java класи можуть бути оголошені всередині інших класів. Це називається внутрішніми (inner) або вкладеними (nested) класами. Вони дозволяють групувати логічно пов’язані класи разом, покращуючи організацію коду та надаючи їм доступ до полів і методів зовнішнього класу.

Види внутрішніх та вкладених класів:

1. Нестатичні внутрішні класи(Inner клас):

  • Це клас, який визначений усередині іншого класу, але не є статичним.
  • Має доступ до полів і методів зовнішнього класу, включно з приватними членами.
  • Щоб створити екземпляр внутрішнього класу, спочатку потрібно створити екземпляр зовнішнього класу.

Приклад:
public class OuterClass {
private String message = “Hello from Outer Class”;

public class InnerClass {
public void printMessage() {
System.out.println(message); // Доступ до приватного поля зовнішнього класу
}
}
}

public class Main {
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.printMessage(); // Виведе “Hello from Outer Class”
}
}

2. Статичні вкладені класи (Static Nested клас):

  • Це клас, оголошений всередині іншого класу з модифікатором static.
  • Не має доступу до нестатичних полів і методів зовнішнього класу, оскільки є статичним.
  • Може використовуватися, не створюючи екземпляр зовнішнього класу.

Приклад:
public class OuterClass {
private static String staticMessage = “Static Message”;

public static class NestedStaticClass {
public void printMessage() {
System.out.println(staticMessage); // Доступ до статичних полів зовнішнього класу
}
}
}

public class Main {
public static void main(String[] args) {
OuterClass.NestedStaticClass nested = new OuterClass.NestedStaticClass();
nested.printMessage(); // Виведе “Static Message”
}
}

3. Локальні класи:

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

Приклад:

public class OuterClass {
public void outerMethod() {
int localVar = 10;

class LocalInnerClass {
public void printLocalVar() {
System.out.println(“Local variable: ” + localVar);
}
}

LocalInnerClass localInner = new LocalInnerClass();
localInner.printLocalVar(); // Виведе “Local variable: 10”
}
}

4. Анонімні класи:

  • Це внутрішні класи без імені, які зазвичай використовуються для створення об’єктів на місці.
  • Часто застосовуються для реалізації інтерфейсів або абстрактних класів.

Приклад:

public class Main {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(“Anonymous class running”);
}
};
runnable.run();
}
}

2. Успадкування (Inheritance)

Успадкування — це механізм ООП, який дозволяє створювати нові класи на основі вже існуючих. Новий клас (похідний або дочірній) отримує всі властивості та методи базового (батьківського) класу, при цьому може додавати власні властивості та методи або перевизначати (override) існуючі.

Основні аспекти успадкування:

1. Ключове слово extends:
Використовується для оголошення класу, який наслідує інший клас.

public class Animal {
public void sound() {
System.out.println(“Animal makes a sound”);
}
}

public class Dog extends Animal {
@Override
public void sound() {
System.out.println(“Dog barks”);
}
}

public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // Виведе “Dog barks”, перевизначений метод
}
}

2. Ключове слово super:

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

Приклад:

public class Animal {
public void sound() {
System.out.println(“Animal makes a sound”);
}
}

public class Dog extends Animal {
@Override
public void sound() {
super.sound(); // Виклик методу з батьківського класу
System.out.println(“Dog barks”);
}
}

public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // Виведе “Animal makes a sound”, а потім “Dog barks”
}
}

3. Конструктори та успадкування:

Конструктори не успадковуються, але дочірній клас може викликати конструктор батьківського класу за допомогою ключового слова super.

Приклад:

public class Animal {
public Animal(String name) {
System.out.println(“Animal name: ” + name);
}
}

public class Dog extends Animal {
public Dog(String name) {
super(name); // Виклик конструктора батьківського класу
}
}

public class Main {
public static void main(String[] args) {
Dog dog = new Dog(“Buddy”); // Виведе “Animal name: Buddy”
}
}

4. Перевизначення методів (Method Overriding):

Дочірній клас може перевизначати методи батьківського класу, щоб надати їм іншу реалізацію. Перевизначений метод має мати таку саму сигнатуру, як у батьківському класі, і повинен бути позначений анотацією `@Override`.

5. Поліморфізм:

Успадкування дозволяє використовувати об’єкти дочірніх класів як об’єкти батьківського класу. Це називається поліморфізмом.

Приклад:
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // Поліморфізм: об’єкт типу Dog, але посилання типу Animal
animal.sound(); // Викличе метод sound класу Dog, виведе “Dog barks”
}
}

Висновок

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

Внутрішні та вкладені класиУспадкування