67 lines
3.6 KiB
Markdown
67 lines
3.6 KiB
Markdown
#java #абстракции
|
|
|
|
Одна из ключевых концепций ООП – абстракция. Мы постоянно используем её в [[Java]], даже не задумываясь. Но давайте разберёмся, зачем она нужна и как правильно применять.
|
|
|
|
📌 Что такое абстракция?
|
|
Абстракция – это процесс выделения существенных характеристик объекта, скрывая при этом детали реализации. Это позволяет нам работать с объектами через их интерфейсы, а не конкретные реализации.
|
|
|
|
Пример из жизни:
|
|
Когда вы едете на машине, вам не нужно знать, как работает двигатель. Достаточно уметь жать на газ, тормозить и поворачивать руль. Вот это и есть абстракция – вам доступен только необходимый интерфейс, а детали скрыты.
|
|
|
|
🔹 Как реализуется абстракция в Java?
|
|
В Java абстракция достигается двумя способами:
|
|
1. Абстрактные классы (abstract class)
|
|
2. Интерфейсы (interface)
|
|
|
|
🚀 Абстрактные классы
|
|
Абстрактный класс может содержать как реализованные, так и абстрактные (без реализации) методы. Его нельзя создать через new, он служит основой для дочерних классов.
|
|
```java
|
|
abstract class Vehicle {
|
|
abstract void start(); // абстрактный метод, без реализации
|
|
|
|
void stop() {
|
|
System.out.println("Машина остановилась");
|
|
}
|
|
}
|
|
|
|
class Car extends Vehicle {
|
|
@Override
|
|
void start() {
|
|
System.out.println("Запуск двигателя...");
|
|
}
|
|
}
|
|
|
|
public class Main {
|
|
public static void main(String[] args) {
|
|
Vehicle car = new Car();
|
|
car.start();
|
|
car.stop();
|
|
}
|
|
}
|
|
```
|
|
|
|
💡 Тут start() – это абстрактный метод, его реализация будет в Car. А вот stop() реализован в базовом классе.
|
|
|
|
🚀 Интерфейсы
|
|
Интерфейсы содержат только сигнатуры методов (до Java 8), а с Java 8 можно добавлять default и static методы.
|
|
|
|
```java
|
|
interface Engine {
|
|
void start();
|
|
}
|
|
|
|
class ElectricCar implements Engine {
|
|
@Override
|
|
public void start() {
|
|
System.out.println("Электродвигатель включен!");
|
|
}
|
|
}
|
|
```
|
|
|
|
📌 Разница между интерфейсом и абстрактным классом в том, что интерфейсы описывают, что класс ДОЛЖЕН делать, а абстрактные классы – как он МОЖЕТ это делать.
|
|
|
|
🎯 Где применять абстракцию?
|
|
- Если у вас иерархия классов с общими методами – используйте абстрактный класс.
|
|
- Если вам нужно гибкое поведение без наследования – используйте интерфейсы.
|
|
|
|
👉 Абстракция позволяет писать гибкий, расширяемый и поддерживаемый код, уменьшая зависимость от конкретных реализаций. |