В чем разница между поведениями абстрактным классом и интерфейсом?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между абстрактным классом и интерфейсом
Состояние и переменные экземпляра
Абстрактный класс может иметь переменные экземпляра с конкретными значениями, защищённые данные и состояние:
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 { ... }