Middle
Kedy by ste mali použiť rozhranie a kedy abstraktnú triedu?
sobes.tech AI
Odpoveď od AI
Користимо апстрактну класу за креирање основне функционалности и општег стања које могу наследити подкласе. Погодна је када постоје заједничке методе са имплементацијом и методе које треба да буду преписане. Апстрактна класа може имати поља и конструкторе.
// Апстрактна класа
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound(); // Апстрактна метода
void eat() { // Метод са имплементацијом
System.out.println(name + " једе.");
}
}
Користимо интерфејс за дефинисање уговора који описује скуп метода које класе морају да имплементирају. Погодан је за постизање вишеструког понашања (вишеструко наслеђивање функционалности). Интерфејс не може имати стање (поља инстанце, осим константи) и конструкторе (пре Java 8).
// Интерфејс
interface Flyable {
void fly(); // Апстрактна метода
}
Табела поређења разлика:
| Карактеристика | Апстрактна класа | Интерфејс |
|---|---|---|
| Тип чланова | Поља, апстрактне и конкретне методе, конструктори | Константе, апстрактне методе (по подразбиру), статичке и default методе (од Java 8) |
| Имплементација метода | Може имати методе са имплементацијом | Само апстрактне методе до Java 8, од Java 8 - static и default |
| Стање | Може имати стање (поља) | Не може имати стање (поља инстанце) |
| Наслеђивање | Једноставно наслеђивање | Вишеструка имплементација |
| Коришћење | "је-" (is-a) - основни тип | "има-" (has-a) - уговор о понашању |