Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 371новая вакансия за сутки·54 593вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 604
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 800
  • Облачные технологии6 651
  • QA вакансии2 171
  • Android1 317
  • Инженер данных867
  • Продакт-менеджер313

Разработка

  • iOS1 229
  • Backend вакансии1 199
  • AI вакансии548
  • Fullstack вакансии495
  • Frontend вакансии424
  • Mobile вакансии28

По стеку

  • Go5 236
  • Java3 132
  • Kotlin1 120
  • Node.js1 005
  • Rust852
  • .NET659
  • PHP319
  • C++268
  • C#207

DevOps и инфраструктура

  • Kubernetes3 912
  • Linux-инфраструктура2 845
  • DevOps вакансии2 675
  • Terraform / IaC2 177
  • Мониторинг и Observability1 072
  • CI/CD915
  • SRE307
  • Кибербезопасность34

Аналитика и данные

  • Аналитик данных528
  • Data Scientist433
  • Бизнес-аналитик399
  • Системный аналитик67

Другие направления

  • Проджект-менеджер105
  • UI/UX дизайн68
  • Ручное тестирование14

По регионам

  • Вакансии в США25 774
  • Вакансии в Европе10 284
  • Работа в России3 616
  • Вакансии в Канаде2 260

По формату

  • Удалённые вакансии42 533
  • Релокация в США25 774
  • Гибридная работа5 661
  • Офисная работа4 440

По уровню

  • Senior вакансии22 599
  • Middle вакансии11 490
  • Junior вакансии3 852

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме JavaВсе вопросы
JavaJuniorТеория

Объясните различия между абстрактными классами и интерфейсами в Java 17+.

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Абстрактный класс даёт частичную реализацию и состояние; интерфейс — контракт без состояния. Класс может реализовывать много интерфейсов, но наследовать только один класс. С Java 8+ интерфейсы поддерживают default/static-методы.

Пример: abstract class

// Общее состояние и шаблонный метод
public abstract class HttpHandler {
    private final String basePath;          // поле экземпляра

    protected HttpHandler(String basePath) {
        this.basePath = basePath;
    }

    // Шаблонный метод — общий алгоритм
    public final Response handle(Request req) {
        validate(req);                       // общий шаг
        return process(req);                 // делегируем подклассу
    }

    protected abstract Response process(Request req);

    private void validate(Request req) {
        if (!req.path().startsWith(basePath))
            throw new IllegalArgumentException("Wrong path: " + req.path());
    }
}

// Конкретная реализация
public class UserHandler extends HttpHandler {
    public UserHandler() { super("/api/users"); }

    @Override
    protected Response process(Request req) {
        return Response.ok("user data");
    }
}

Ключевое отличие

Абстрактный класс предназначен для is-a-иерархии с общим состоянием и частичной реализацией. Интерфейс описывает роль или способность — контракт без полей экземпляра. Класс наследует ровно один абстрактный класс, но реализует произвольное число интерфейсов.

Что разрешено где

Abstract classInterface (Java 8+)
Поля экземпляраданет (только static final)
Конструкторданет
default-методы—да
static-методыдада (Java 8+)
private-методыдада (Java 9+)
sealed-иерархиида (Java 17)да (Java 17)

Пример: interface + default-метод

// Роль — объект умеет логировать себя
public interface Auditable {
    String auditId();

    // default-метод — поведение по умолчанию без реализации в классе
    default String auditEntry() {
        return "[AUDIT] " + auditId() + " at " + Instant.now();
    }
}

// Один класс может носить несколько ролей
public class Order implements Auditable, Serializable {
    private final UUID id;
    public Order(UUID id) { this.id = id; }

    @Override
    public String auditId() { return id.toString(); }
}

// Использование
Order o = new Order(UUID.randomUUID());
System.out.println(o.auditEntry());  // [AUDIT] 3fa8… at 2026-05-19T…

Sealed-иерархии (Java 17)

// Закрытая иерархия — и abstract class, и interface могут быть sealed
public sealed interface Shape permits Circle, Rectangle, Triangle {}

public record Circle(double radius) implements Shape {}
public record Rectangle(double w, double h) implements Shape {}
public record Triangle(double base, double height) implements Shape {}

// Компилятор гарантирует полноту switch
double area = switch (shape) {
    case Circle c    -> Math.PI * c.radius() * c.radius();
    case Rectangle r -> r.w() * r.h();
    case Triangle t  -> 0.5 * t.base() * t.height();
};

Когда выбирать что

  • Есть общее состояние или шаблонный метод — abstract class.
  • Нужна множественная «роль» без состояния — interface.
  • Хотите закрытую иерархию для pattern matching — sealed interface + records.
  • Ретрофит в существующую иерархию (добавить поведение без breaking change) — default-метод интерфейса.

Подводные камни

  • Diamond problem с default-методами. Если два интерфейса объявляют одноимённый default-метод, класс обязан явно переопределить его, иначе компиляция упадёт с ошибкой.
  • Нарушение контракта equals/hashCode. Абстрактный класс с полями может неявно менять контракт equals; подкласс, добавивший поля, сломает симметрию.
  • Злоупотребление abstract class вместо composition. Глубокая иерархия (3+ уровней) трудно тестируется; часто лучше делегировать через поле.
  • Интерфейс с единственным методом — не всегда @FunctionalInterface. Добавление второго абстрактного метода ломает все лямбды-реализации во всём коде без предупреждения (разве что аннотация есть).
  • sealed + non-sealed в одной иерархии. Разрешение non-sealed открывает «дыру» в замкнутой иерархии — компилятор больше не гарантирует полноту switch.
  • private-методы интерфейса (Java 9) не наследуются. Их нельзя вызвать из реализующего класса — только из default/static-методов того же интерфейса.
  • Абстрактный класс без абстрактных методов. Это легально, но сбивает с толку: выглядит как обычный класс, но его нельзя инстанциировать напрямую.
  • Смешивание ролей через интерфейсы без меры. Класс, реализующий 10 интерфейсов — God Object; каждый интерфейс должен нести единственную ответственность (ISP).

Типичные ошибки

  • Путать термин «abstract class interface» с соседним механизмом Java.
  • Не называть границу lifecycle, transaction, thread или request для «abstract class interface».
  • Игнорировать production-эффекты «abstract class interface»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «abstract class interface» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «abstract class interface».
  • Уточнить, какие настройки или API меняют «abstract class interface» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Java →

Источники

  • https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/FunctionalInterface.html
←Предыдущий вопросКак работает `CompletableFuture` и чем он отличается от `Future`?Следующий вопрос→В чём разница между `Comparable` и `Comparator`?

Связанные темы

Javabackend-designtechnical-communication

Частые вопросы на собеседовании

  • Как работает сборка мусора в Java? Объясните G1GC, ZGC и Shenandoah.
  • Как работает модель памяти Java? В чём разница между heap и stack?
  • Объясните Java Memory Model (JMM) и концепцию happens-before.
  • Что такое virtual threads (Project Loom) и чем они отличаются от platform threads?