Загрузка данных


//  АБСТРАКТНЫЙ КЛАСС 

abstract class Vehicle {
    // Может иметь состояние (поля)
    protected String brand;
    protected int year;
    private int id; // private тоже можно

    // Конструктор!
    public Vehicle(String brand, int year) {
        this.brand = brand;
        this.year = year;
        this.id = generateId();
    }

    // Может иметь конкретные методы
    public void displayInfo() {
        System.out.println(brand + " (" + year + ")");
    }

    // Может иметь protected методы
    protected int generateId() {
        return (int)(Math.random() * 1000);
    }

    // Абстрактные методы (должны быть реализованы)
    public abstract void startEngine();
    public abstract void stopEngine();
}




// ИНТЕРФЕЙС 

interface ElectricVehicle {
    // Только константы (public static final по умолчанию)
    int BATTERY_WARRANTY_YEARS = 8;

    // Абстрактные методы (public abstract по умолчанию)
    void chargeBattery();
    int getBatteryLevel();

    // default метод (Java 8+)
    default void showBatteryStatus() {
        System.out.println("Battery level: " + getBatteryLevel() + "%");
    }

    // static метод (Java 8+)
    static void printWarranty() {
        System.out.println("Warranty: " + BATTERY_WARRANTY_YEARS + " years");
    }
}

interface AutonomousDriving {
    void enableAutopilot();
    void disableAutopilot();

    default void selfPark() {
        System.out.println("Self‑parking engaged");
    }
}

// КЛАСС, НАСЛЕДУЮЩИЙ АБСТРАКТНЫЙ КЛАСС И РЕАЛИЗУЮЩИЙ ИНТЕРФЕЙСЫ 
class ElectricCar extends Vehicle implements ElectricVehicle, AutonomousDriving {
    private int batteryLevel = 100;

    // Должен вызвать конструктор абстрактного класса
    public ElectricCar(String brand, int year) {
        super(brand, year);
    }

    // Реализация абстрактных методов Vehicle
    @Override
    public void startEngine() {
        if (batteryLevel > 10) {
            System.out.println(brand + " electric motor started silently");
        } else {
            System.out.println("Low battery! Please charge");
        }
    }

    @Override
    public void stopEngine() {
        System.out.println(brand + " electric motor stopped");
    }

    // Реализация методов ElectricVehicle
    @Override
    public void chargeBattery() {
        batteryLevel = 100;
        System.out.println("Battery fully charged");
    }

    @Override
    public int getBatteryLevel() {
        return batteryLevel;
    }

    // Реализация методов AutonomousDriving
    @Override
    public void enableAutopilot() {
        System.out.println(brand + " autopilot enabled");
    }

    @Override
    public void disableAutopilot() {
        System.out.println(brand + " autopilot disabled");
    }

    // Собственный метод
    public void showCompleteInfo() {
        displayInfo(); // из Vehicle
        showBatteryStatus(); // default метод из интерфейса
    }
}

// Пример использования
public class Main {
    public static void main(String[] args) {
        ElectricCar tesla = new ElectricCar("Tesla", 2023);

        tesla.startEngine(); // из абстрактного класса
        tesla.enableAutopilot(); // из интерфейса
        tesla.chargeBattery(); // из интерфейса
        tesla.displayInfo(); // конкретный метод из Vehicle

        // Вызов static метода интерфейса
        ElectricVehicle.printWarranty();

        // Полиморфизм через абстрактный класс
        Vehicle vehicle = tesla;
        vehicle.startEngine(); // работает

        // Полиморфизм через интерфейс
        ElectricVehicle ev = tesla;
        ev.chargeBattery(); // работает
    }
}