Klasa abstrakcyjna vs interfejs w Javie
Aby zrozumieć różnice między klasą abstrakcyjną a interfejsem w Javie, ważne jest przede wszystkim zrozumienie każdego z nich niezależnie. Klasa abstrakcyjna w Javie jest używana w deklaracji podklas z zestawem wspólnych cech. Powszechnym zastosowaniem klasy abstrakcyjnej jest superklasa innych klas, co w efekcie pozwala jej rozszerzyć klasę abstrakcyjną. Słowo abstrakcyjne jest używane w deklaracji klasy abstrakcyjnej. Tak jak każda inna klasa, klasa abstrakcyjna ma pola opisujące metody i cechy, które klasa może wykonać. Sama deklaracja klasy abstrakcyjnej nie może być inicjowana
Interfejs Java może być utożsamiany z protokołem. Reprezentuje ustalone i uzgodnione zachowanie, które umożliwia ułatwienie interakcji niepowiązanych obiektów. W zależności od użytkownika interfejs posiada klucz do różnych działań. Interfejs służy zatem jako łącznik między producentem a konsumentem. Interfejsy w Javie są zatem grupą metod zawierających puste ciała, które mogą mieć stałe deklaracje. Wystawienie klasy na interfejs Java oznacza, że oczekiwanym zachowaniem klasy jest implementacja wszystkich metod interfejsu.
Różnice
Po pierwsze, klasa abstrakcyjna pozwala na pola, które nie są statyczne lub końcowe, w przeciwieństwie do pól statycznych i końcowych używanych w interfejsach. Interfejsy nie mogą mieć w sobie żadnego kodu implementacyjnego i może istnieć kod implementacyjny używany w klasie abstrakcyjnej. Kody implementacji wprowadzone w klasie abstrakcyjnej mogą mieć kilka lub wszystkie zaimplementowane metody. Domyślnie wszystkie metody interfejsu są „abstrakcyjne”.
Widoczność jest również możliwa dla metod lub członków klasy abstrakcyjnej, które mogą być różne, takie jak public, chronione, prywatne lub brak. Z drugiej strony widoczność interfejsu można ustawić tylko na jeden tryb widoczności, który jest „publiczny”.
Klasa abstrakcyjna automatycznie odziedziczy klasę obiektową. W efekcie oznacza to, że uwzględniono metody takie jak clone () i equals (). W interfejsie nie jest możliwe dziedziczenie klasy obiektu. Następnie klasa abstrakcyjna może mieć konstruktor, ale interfejs nie może go mieć.
Interfejs w Javie pełni również bardzo ważną funkcję z implementacją wielu dziedziczeń, ponieważ klasa może mieć tylko jedną superklasę. Chociaż może być obecna tylko jedna superklasa, można ją zaimplementować w dowolnej liczbie interfejsów. Nie można mieć wielu spadków w klasie abstrakcyjnej.
W działaniu interfejsy są zwykle wolniejsze w implementacji niż klasa abstrakcyjna, głównie z powodu dodatkowego kierunku znajdowania odpowiedniej metody w klasie. Różnica stała się jednak wolniejsza z powodu nowoczesnych maszyn wirtualnych Java, które są ciągle aktualizowane.
Dodanie metody do interfejsu wymaga śledzenia wszystkich klas implementujących, które implementują określony interfejs. Alternatywnie możesz rozszerzyć interfejs, aby pozwolić mu na dodatkowe metody. Jeśli masz do czynienia z klasą abstrakcyjną, wystarczy dodać domyślną implementację metody, a kod będzie działał dalej. Ponieważ istnieją różnice między klasami abstrakcyjnymi i interfejsami, należy zauważyć, że nie są one rywalami, ale różnice tutaj wspomniane służą wzajemnemu uzupełnianiu się.
streszczenie
Pola klasy abstrakcyjnej nie są statyczne ani końcowe, w przeciwieństwie do interfejsu zawierającego tabele statyczne i końcowe.
Żaden kod implementacji nie może być użyty w interfejsach, podczas gdy można go użyć w klasie abstrakcyjnej.
Widoczność interfejsu może być publiczna, natomiast widoczność klasy abstrakcyjnej może się różnić.
Klasa abstrakcyjna automatycznie odziedziczy klasę obiektową, ale nie jest to możliwe w interfejsie.
Klasa abstrakcyjna jest szybsza niż interfejs w implementacji.