Интерфейсы и абстрактные классы — это два ключевых механизма в Java, которые позволяют реализовывать абстракцию и полиморфизм. Однако они имеют существенные различия в своей структуре, использовании и предназначении. Давайте разберем их подробно.
Интерфейс (Interface):
public static final
).default
методы) и статические методы.Пример интерфейса:
public interface Animal {
void makeSound(); // Абстрактный метод
default void sleep() { // Метод с реализацией по умолчанию
System.out.println("Sleeping...");
}
static void describe() { // Статический метод
System.out.println("This is an animal interface.");
}
}
Абстрактный класс:
Пример абстрактного класса:
public abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void makeSound(); // Абстрактный метод
public void sleep() { // Метод с реализацией
System.out.println(name + " is sleeping...");
}
}
Интерфейс:
extends
.Пример:
public interface Mammal extends Animal {
void giveBirth();
}
Абстрактный класс:
Пример:
public abstract class Dog extends Animal implements Mammal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println("Woof!");
}
@Override
public void giveBirth() {
System.out.println("Giving birth to puppies...");
}
}
Интерфейс:
Абстрактный класс:
Интерфейс:
public static final
.Абстрактный класс:
Интерфейс:
public
.private
методы для внутренней реализации.Абстрактный класс:
public
, protected
, private
).public interface Flyable {
void fly();
}
public class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying...");
}
}
public abstract class Vehicle {
protected String model;
public Vehicle(String model) {
this.model = model;
}
public abstract void start();
public void stop() {
System.out.println(model + " has stopped.");
}
}
public class Car extends Vehicle {
public Car(String model) {
super(model);
}
@Override
public void start() {
System.out.println(model + " is starting...");
}
}
Интерфейс:
public
.Абстрактный класс:
Выбор между интерфейсом и абстрактным классом зависит от конкретной задачи. Если вам нужно определить контракт для множества классов, используйте интерфейс. Если вам нужно предоставить общую реализацию для группы связанных классов, используйте абстрактный класс.