Что такое класс? Что такое интерфейс? Какая между ними разница?android-2

1. Класс

Определение:
Класс — это шаблон/описание для создания объектов, который инкапсулирует:

  • Данные (поля/свойства)
  • Поведение (методы/функции)
  • Состояние (значения полей)

Характеристики класса:

  • Может иметь конструкторы
  • Поддерживает наследование (но только одиночное в Java)
  • Может быть абстрактным
  • Может содержать реализацию методов
  • Может иметь модификаторы доступа (public, private и т.д.)

Пример класса в Kotlin:

class Car(
    val model: String,  // свойство
    private var speed: Int  // приватное свойство
) {
    fun accelerate(amount: Int) {  // метод
        speed += amount
    }

    fun currentSpeed() = speed  // метод
}

2. Интерфейс

Определение:
Интерфейс — это контракт, который определяет что должен делать класс, но не как он это должен делать.

Характеристики интерфейса:

  • Содержит только абстрактные методы (до Java 8)
  • Начиная с Java 8 может иметь методы с реализацией (default методы)
  • Класс может реализовывать множество интерфейсов
  • Не может содержать состояние (поля, кроме public static final)
  • В Kotlin может содержать свойства и реализацию методов

Пример интерфейса в Kotlin:

interface Drivable {
    fun startEngine()  // абстрактный метод

    fun stopEngine() {  // метод с реализацией
        println("Engine stopped")
    }

    val maxSpeed: Int  // абстрактное свойство
}

Ключевые различия

Характеристика Класс Интерфейс
НаследованиеОдиночное (extends)Множественное (implements)
СостояниеМожет хранить (поля)Не может (кроме констант)
КонструкторыИмеютсяОтсутствуют
Реализация методовПолнаяТолько абстрактные (обычно)
Модификаторы доступаЛюбыеТолько public (по умолчанию)
ИспользованиеДля создания объектовДля определения контрактов

Практический пример в Android

Интерфейс:

interface OnItemClickListener {
    fun onItemClick(position: Int)
}

Класс, реализующий интерфейс:

class MyAdapter(private val listener: OnItemClickListener) : RecyclerView.Adapter<MyViewHolder>() {
    // ...
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.itemView.setOnClickListener {
            listener.onItemClick(position)
        }
    }
}

Эволюция интерфейсов

  1. До Java 8:

    • Только абстрактные методы
    • Только константы (public static final)
  2. Java 8+:

    • default методы
    • static методы в интерфейсах
  3. Kotlin:

    • Свойства в интерфейсах
    • Реализация методов по умолчанию
    • Функциональные интерфейсы (fun interface)

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

Используйте класс когда:

  • Нужно создавать экземпляры объектов
  • Требуется хранить состояние
  • Нужна полная реализация логики

Используйте интерфейс когда:

  • Нужно определить контракт для разных реализаций
  • Требуется множественное "наследование"
  • Хотите обеспечить слабую связанность компонентов

Резюмируем

  1. Класс — это конкретная реализация с состоянием и поведением, шаблон для объектов.
  2. Интерфейс — это контракт, определяющий что должен делать класс без реализации (в основном).
  3. Главные различия:
    • Классы хранят состояние, интерфейсы — нет
    • Множественное наследование только через интерфейсы
    • Интерфейсы обеспечивают слабую связанность
  4. В современной Android разработке (особенно с Kotlin) границы между ними немного стираются, но концептуальные различия остаются.

P.S. На собеседованиях часто спрашивают про абстрактные классы как нечто среднее между классом и интерфейсом — будьте готовы к этому вопросу.