Разлика между абстрактен клас и интерфейс в Java
Ключова разлика между абстрактен клас и интерфейс в Java
- В интерфейса един клас може да реализира множество интерфейси, докато класът може да наследи само един абстрактен клас.
- В интерфейса няма модификатори за достъп. Предполага се, че всичко, дефинирано в интерфейса, има публичен модификатор, докато абстрактният клас може да има модификатор за достъп.
- Интерфейсът не може да съдържа полета с данни, докато абстрактният клас може да има полета с данни.
- Интерфейсите помагат да се дефинират периферните способности на класа, докато абстрактен клас дефинира идентичността на класа.
Какво е абстрактен клас?
Клас, който има ключовата дума abstract в своята декларация, се нарича абстрактен клас. Абстрактните класове трябва да имат нула или повече абстрактни методи. т.е. методи без тяло. Може да има множество конкретни методи. Абстрактните класове ви позволяват да създавате чертежи за конкретни класове. Но наследяващият клас трябва да имплементира абстрактния метод. Абстрактните класове не могат да бъдат инстанцирани.
Важни причини за използване на интерфейси
- Използват се интерфейси за постигане абстракция.
- Проектиран да поддържа динамична резолюция на метода по време на изпълнение
- Помага ви да постигнете хлабаво свързване.
- Позволява ви да отделите дефиницията на метод от йерархията на наследяване
Важни причини за използване на абстрактен клас
- Абстрактните класове предлагат функционалност по подразбиране за подкласовете.
- Предоставя шаблон за бъдещи специфични класове
- Помага ви да дефинирате общ интерфейс за неговите подкласове
- Абстрактният клас позволява повторно използване на кода.
Какво е интерфейс?
Интерфейсът е план, който може да се използва за имплементиране на клас. Интерфейсът не съдържа никакви конкретни методи (методи, които имат код). Всички методи на интерфейса са абстрактни методи. Интерфейс не може да бъде създаден. Въпреки това, класовете, които имплементират интерфейси, могат да бъдат създадени. Интерфейсите никога не съдържат променливи на екземпляри, но могат да съдържат публични статични крайни променливи (т.е. постоянни променливи на клас)
Разлика между интерфейс и абстрактен клас в Java
Абстрактен клас ви позволява да правите функционалност, която подкласовете могат да внедрят или заменят, докато интерфейсът ви позволява само да посочите функционалност, но не и да я внедрите. Един клас може да разшири само един абстрактен клас, докато един клас може да реализира множество интерфейси.
| параметри | Interface | Абстрактен клас |
|---|---|---|
| Скорост | Бавен | Бързо |
| Множество наследства | Реализирайте няколко интерфейса | Само един абстрактен клас |
| структура | Абстрактни методи | Абстрактни и конкретни методи |
| Кога да използвате | Бъдещо подобрение | За да избегнете независимостта |
| Наследяване/ Внедряване | Един клас може да реализира множество интерфейси | Класът може да наследи само един абстрактен клас |
| Внедряване по подразбиране | Докато добавяте нови неща към интерфейса, е кошмар да намерите всички изпълнители и да внедрите новодефинирани неща. | В случай на абстрактен клас можете да се възползвате от изпълнението по подразбиране. |
| Модификатори на достъп | Интерфейсът няма модификатори за достъп. Всичко, дефинирано вътре в интерфейса, се приема за публичен модификатор. | Абстрактният клас може да има модификатор за достъп. |
| Кога да използвате | По-добре е да се използва интерфейс, когато различни реализации споделят само сигнатура на метод. Полиморфна йерархия на типове стойности. | Трябва да се използва, когато различни реализации от един и същи вид споделят общо поведение. |
| Полета за данни | интерфейсът не може да съдържа полета с данни. | класът може да има полета за данни. |
| Множествено наследяване по подразбиране | Един клас може да реализира множество интерфейси. | Един клас наследява само един абстрактен клас. |
| изпълнение | Интерфейсът е абстрактен, така че не може да предостави никакъв код. | Абстрактен клас може да даде пълен код по подразбиране, който трябва да бъде заменен. |
| Използване на модификатори на Access | Не можете да използвате модификатори за достъп за метода, свойствата и т.н. | Можете да използвате абстрактен клас, който съдържа модификатори за достъп. |
| употреба | Интерфейсите помагат да се дефинират периферните способности на даден клас. | Абстрактен клас дефинира идентичността на клас. |
| Дефинирани полета | Не могат да се дефинират полета | Абстрактният клас ви позволява да дефинирате както полета, така и константи |
| наследяване | Един интерфейс може да наследи множество интерфейси, но не може да наследи клас. | Абстрактен клас може да наследи клас и множество интерфейси. |
| Конструктор или деструктори | Интерфейсът не може да декларира конструктори или деструктори. | Абстрактен клас може да декларира конструктори и деструктори. |
| Ограничение на разширенията | Може да разшири произволен брой интерфейси. | Може да разшири само един клас или един абстрактен клас наведнъж. |
| Абстрактна ключова дума | В абстрактен интерфейс ключовата дума е незадължителна за деклариране на метод като абстракт. | В абстрактен клас ключовата дума abstract е задължителна за деклариране на метод като абстракт. |
| Тип клас | Един интерфейс може да има само публични абстрактни методи. | Абстрактният клас има защитени и публични абстрактни методи. |
Примерен код за интерфейс и абстрактен клас в Java
Следва примерен код за създаване на интерфейс и абстрактен клас Java
Синтаксис на интерфейса
interface name{
//methods
}
Java Пример за интерфейс:
interface Pet {
public void test();
}
class Dog implements Pet {
public void test() {
System.out.println("Interface Method Implemented");
}
public static void main(String args[]) {
Pet p = new Dog();
p.test();
}
}
Синтаксис на абстрактния клас
abstract class name{
// code
}
Пример за абстрактен клас:
abstract class Shape {
int b = 20;
abstract public void calculateArea();
}
public class Rectangle extends Shape {
public static void main(String args[]) {
Rectangle obj = new Rectangle();
obj.b = 200;
obj.calculateArea();
}
public void calculateArea() {
System.out.println("Area is " + (b * b));
}
}

