← Назад к вопросам

В чем разница между поведениями абстрактным классом и интерфейсом?

1.0 Junior🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между абстрактным классом и интерфейсом

Состояние и переменные экземпляра

Абстрактный класс может иметь переменные экземпляра с конкретными значениями, защищённые данные и состояние:

public abstract class Animal {
    private String name;        // переменная состояния
    protected int age;          // можно изменять
    private static int count;   // статическое состояние
    
    public Animal(String name) {
        this.name = name;
    }
}

Интерфейс до Java 8 не мог содержать никаких переменных. С Java 8 можно только константы:

public interface Drawable {
    int MAX_WIDTH = 1000;  // неявно final и static
    String DEFAULT_COLOR = "black";
}

Методы и их реализация

Абстрактный класс может содержать полностью реализованные методы:

public abstract class Vehicle {
    public abstract void start();  // абстрактный метод
    
    public void honk() {           // полная реализация
        System.out.println("Beep!");
    }
    
    protected void maintenance() { // с логикой
        System.out.println("Checking fuel");
    }
}

Интерфейс раньше содержал только сигнатуры. С Java 8 добавлены default методы и static методы:

public interface Runnable {
    void run();  // абстрактный метод
    
    default void pause() {  // Java 8+
        System.out.println("Paused");
    }
    
    static void logExecution() {  // Java 8+
        System.out.println("Running");
    }
}

Видимость и модификаторы

Абстрактный класс позволяет использовать разные уровни доступа:

public abstract class BaseController {
    public abstract void handle();
    protected abstract void validate();
    private void internalSetup() {}  // приватные методы
    protected String name;            // защищённые поля
    private int internalState;        // приватные поля
}

В интерфейсе все методы (кроме private Java 9+) имеют видимость public:

public interface Handler {
    void process();  // явно public
    
    private void helper() {}  // Java 9+ - приватные методы
}

Наследование и множественность

Класс может наследовать только один абстрактный класс:

class Dog extends Animal {  // одного базового класса
    // реализация
}

Класс может реализовать множество интерфейсов:

class Dog extends Animal implements Runnable, Comparable<Dog>, Cloneable {
    // реализация всех интерфейсов
}

Конструкторы

Абстрактный класс может иметь конструкторы для инициализации состояния:

public abstract class Shape {
    private String color;
    
    public Shape(String color) {  // конструктор
        this.color = color;
    }
    
    public abstract double getArea();
}

Интерфейс не может иметь конструкторы (нет состояния для инициализации).

Когда использовать что

  • Абстрактный класс: IS-A отношение, общее состояние, логика конструктора, методы с разными уровнями доступа
  • Интерфейс: контракт поведения, множественное наследование функциональности, определение возможностей
// IS-A отношение - абстрактный класс
public abstract class Employee { ... }
public class Manager extends Employee { ... }

// Возможность/контракт - интерфейс
public interface Payable { ... }
public class Employee implements Payable { ... }
public class Contractor implements Payable { ... }
В чем разница между поведениями абстрактным классом и интерфейсом? | PrepBro