# Абстрактные классы и интерфейсы

1. **Абстрактные классы**:
   * Абстрактный класс в Java - это класс, который содержит один или несколько абстрактных методов.
   * Абстрактный метод - это метод, который объявлен, но не имеет реализации в абстрактном классе. Реализация абстрактного метода оставляется на усмотрение подкласса.
   * Абстрактные классы нельзя инстанциировать, т.е. нельзя создать объект абстрактного класса. Они используются в основном для создания шаблонов, которые наследуются подклассами для предоставления конкретной реализации.
   * Абстрактный класс может содержать как абстрактные методы, так и обычные методы с реализацией.
   * Для объявления абстрактного класса используется ключевое слово `abstract`.

Пример:

```java
abstract class Shape {
    // Абстрактный метод
    abstract void draw();
    
    // Обычный метод
    void resize() {
        System.out.println("Resize shape");
    }
}
```

2. **Интерфейсы**:
   * Интерфейс в Java - это абстрактный тип данных, определяющий методы, но не предоставляющий их реализации.
   * В интерфейсе могут быть только абстрактные методы (до Java 8), а также методы с реализацией и статические методы (начиная с Java 8).
   * Классы могут реализовывать (implements) один или несколько интерфейсов. При этом класс обязан предоставить реализацию всех методов интерфейса.
   * Интерфейсы предоставляют способ реализации множественного наследования в Java.
   * Для объявления интерфейса используется ключевое слово `interface`.

Пример:

```java
interface Drawable {
    // Абстрактный метод
    void draw();
    
    // Метод с реализацией (начиная с Java 8)
    default void resize() {
        System.out.println("Resize shape");
    }
}
```

Подведем итоги:

* Абстрактные классы предоставляют частичную реализацию, в то время как интерфейсы определяют контракт для классов.
* Класс может наследоваться только от одного класса (абстрактного или не абстрактного), но может реализовывать несколько интерфейсов.
* Используйте абстрактные классы, если хотите предоставить базовую реализацию и иметь возможность расширения этой реализации. Используйте интерфейсы, если хотите определить контракт для классов без предоставления какой-либо реализации.
