Характеристика | Абстрактный класс | Интерфейс |
---|---|---|
Назначение | Частичная реализация + общий шаблон | Контракт для реализации |
Ключевые слова | abstract class в Kotlin/Java | interface в Kotlin/Java |
Экземпляры | Нельзя создать напрямую | Нельзя создать напрямую |
Наследование | Одиночное наследование (extends ) | Множественная реализация (implements ) |
Состояние (поля) | Может содержать поля с состоянием | Только abstract свойства или константы |
Конструкторы | Может иметь конструкторы | Не может иметь конструкторов |
Модификаторы доступа | Любые (private , protected и т.д.) | По умолчанию public |
Абстрактный класс:
abstract class Animal {
abstract fun makeSound() // абстрактный метод (без реализации)
fun eat() { // метод с реализацией
println("Eating...")
}
}
Интерфейс (до Kotlin 1.4 / Java 8):
interface Drivable {
fun drive() // абстрактный метод
// До Kotlin 1.4 нельзя было иметь реализацию
}
Современный интерфейс (Kotlin/Java 8+):
interface Drivable {
fun drive() // абстрактный метод
fun startEngine() { // метод с реализацией по умолчанию
println("Engine started")
}
}
Абстрактный класс может хранить состояние:
abstract class Vehicle(val maxSpeed: Double) {
var currentSpeed: Double = 0.0
protected set
}
Интерфейс не может хранить состояние (но в Kotlin может иметь свойства):
interface Clickable {
val clickCount: Int // абстрактное свойство
// Не может иметь backing field (состояние)
}
Абстрактный класс:
abstract class BaseActivity : AppCompatActivity() {
constructor(layoutId: Int) : super() {
setContentView(layoutId)
}
}
Интерфейс не может иметь конструкторов!
abstract class BaseActivity : AppCompatActivity() {
abstract val layoutId: Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(layoutId)
setupViews()
}
abstract fun setupViews()
}
abstract class BaseAdapter<T> : RecyclerView.Adapter<BaseViewHolder<T>>() {
protected val items = mutableListOf<T>()
fun updateData(newItems: List<T>) {
items.clear()
items.addAll(newItems)
notifyDataSetChanged()
}
override fun getItemCount() = items.size
}
interface OnItemClickListener {
fun onItemClick(position: Int, view: View)
}
interface PaymentStrategy {
fun pay(amount: Double)
}
class CreditCardPayment : PaymentStrategy { ... }
class PayPalPayment : PaymentStrategy { ... }
Java 7 и ранее:
public static final
)Java 8+:
default
методыstatic
методы в интерфейсахKotlin:
fun interface
)Используйте абстрактный класс когда:
Используйте интерфейс когда:
P.S. На собеседованиях часто просят привести примеры из реальной практики - будьте готовы рассказать, как вы использовали оба подхода в своих проектах!