Kluczowa różnica: Interfejs lub protokół jest popularnym sposobem, który pozwala niezwiązanym obiektom komunikować się ze sobą. Reprezentuje uzgodnione zachowanie, które ułatwia interakcję między dwoma obiektami. Klasa abstrakcyjna to klasa obiektów, których nie można utworzyć w instancji lub skonfigurować instancji obiektu. Ta klasa może nie mieć implementacji lub może mieć niekompletną implementację.
Java jest językiem programowania, na który wpłynął język C. Składa się on z dużej części składni C i C ++, jednak ma mniej obiektów niskiego poziomu. Java jest uniwersalnym językiem programowania, który ma mniej zależności implementacyjnych w porównaniu do poprzednich języków. Jest to język współbieżny, oparty na klasach i obiektowy.
Java została opracowana przez Jamesa Goslinga w Sun Microsystems i została wydana w 1995 roku. Pierwotnie została wydana jako główny komponent platformy Java Sun Microsystems. Od tego czasu Sun przejął licencję na większość technologii Java na licencji GNU General Public Licence. Oznacza to, że cała technologia objęta licencją GNU General Public Licence jest open source i ogólnie dostępna bezpłatnie. Sun Microsystems ostatecznie połączył się z Oracle Corporation. Od 2012 roku Java stała się jednym z najpopularniejszych języków programowania. Dotyczy to szczególnie aplikacji internetowych typu klient-serwer. Wiele innych systemów opracowało alternatywne implementacje technologii Sun, takie jak GNU Compiler for Java i GNU Classpath.
Klasa abstrakcyjna to klasa obiektów, których nie można utworzyć w instancji lub skonfigurować instancji obiektu. Ta klasa może nie mieć implementacji lub może mieć niekompletną implementację. Może również zawierać abstrakcyjne metody lub właściwości, które są wspólne dla wszystkich podklas. W niektórych językach programowania typy abstrakcyjne bez implementacji są znane jako interfejsy. W języku Java typ abstrakcyjny można utworzyć za pomocą słowa kluczowego "abstract" w definicji klasy. Celem posiadania klasy abstrakcyjnej jest umieszczenie wszystkich metod, które nie są zaimplementowane w klasie abstrakcyjnej i pozostawienie jej podklasie w celu określenia sposobu implementacji tych klas. Jeśli klasa ma jedną abstrakcyjną metodę, klasa musi być zadeklarowana jako klasa abstrakcyjna, chociaż nie trzeba mieć co najmniej jednej metody deklarowania abstrakcji klasy.
Malliktalksjava.in wymienia główne różnice między interfejsem i streszczeniem jako:
- Klasa abstrakcyjna ma konstruktor, ale interfejs nie.
- Klasy abstrakcyjne mogą mieć implementacje dla niektórych członków (metod), ale interfejs nie może mieć implementacji dla żadnego z jej członków.
- Klasy abstrakcyjne powinny mieć podklasy, które będą bezużyteczne.
- Interfejsy muszą mieć implementacje innych klas, które będą bezużyteczne
- Tylko interfejs może rozszerzyć inny interfejs, ale każda klasa może rozszerzyć klasę abstrakcyjną.
- Wszystkie zmienne w interfejsach są domyślnie końcowe
- Interfejsy zapewniają formę wielokrotnego dziedziczenia. Klasa może obejmować tylko jedną inną klasę.
- Interfejsy są ograniczone do publicznych metod i stałych bez implementacji. Klasy abstrakcyjne mogą mieć częściową implementację, części chronione, metody statyczne itp.
- Klasa może implementować kilka interfejsów. Ale w przypadku klasy abstrakcyjnej klasa może rozciągać się tylko na jedną klasę abstrakcyjną.
- Interfejsy są powolne, ponieważ wymagają dodatkowego pośrednictwa, aby znaleźć odpowiednią metodę w rzeczywistej klasie. Klasy abstrakcyjne są szybkie.
- Modyfikator dostępności (publiczny / prywatny / wewnętrzny) jest dozwolony dla klasy abstrakcyjnej. Interfejs nie zezwala na modyfikator dostępu
- Klasa abstrakcyjna może zawierać pełne lub niekompletne metody. Interfejsy mogą zawierać tylko podpis metody, ale bez treści. Zatem klasa abstrakcyjna może implementować metody, ale interfejs nie może implementować metod.
- Klasa abstrakcyjna może zawierać pola, konstruktory lub destruktory i właściwości implementacji. Interfejs nie może zawierać pól, konstruktorów ani destruktorów i ma tylko podpis właściwości, ale brak implementacji.
- Różne modyfikatory dostępu, takie jak abstrakcyjne, chronione, wewnętrzne, publiczne, wirtualne itp. Są użyteczne w klasach abstrakcyjnych, ale nie w interfejsach.
- Zakres abstrakcji zależy od klasy pochodnej.
- Zasięg interfejsu odpowiada dowolnemu poziomowi jego łańcucha dziedziczenia.
Informacje na temat tabeli pochodzą z witryny codeproject.com i mindprod.com
Berło | Klasa abstrakcyjna | |
Wielokrotne dziedziczenie | Klasa może dziedziczyć kilka interfejsów. | Klasa może dziedziczyć tylko jedną klasę abstrakcyjną. |
Domyślna implementacja | Interfejs nie może dostarczyć żadnego kodu, tylko podpis. | Klasa abstrakcyjna może dostarczyć pełny, domyślny kod i / lub tylko szczegóły, które muszą zostać zastąpione. |
Modyfikatory dostępu | Interfejs nie może mieć modyfikatorów dostępu dla podsystemów, funkcji, właściwości itd. Wszystko jest przyjmowane jako publiczne. | Klasa abstrakcyjna może zawierać modyfikatory dostępu dla podsystemów, funkcji, właściwości. |
Core vs. Peripheral | Interfejsy są używane do definiowania peryferyjnych umiejętności klasy. Innymi słowy, zarówno człowiek jak i pojazd mogą dziedziczyć z interfejsu wymiennego. | Klasa abstrakcyjna definiuje rdzenną tożsamość klasy i tam jest używana dla obiektów tego samego typu. |
Jednorodność | Jeśli różne implementacje dzielą tylko sygnatury metod, lepiej jest użyć interfejsów. | Jeśli różne implementacje są tego samego rodzaju i używają wspólnego zachowania lub statusu, wówczas lepiej zastosować klasę abstrakcyjną. |
Prędkość | Wymaga więcej czasu na znalezienie właściwej metody w odpowiednich klasach. | Szybki |
Dodawanie funkcjonalności | Jeśli dodamy nową metodę do interfejsu, musimy wyśledzić wszystkie implementacje interfejsu i zdefiniować implementację dla nowej metody. | Jeśli dodamy nową metodę do klasy abstrakcyjnej, mamy opcję domyślnej implementacji, dlatego cały istniejący kod może działać poprawnie. |
Pola i stałe | W interfejsach nie można definiować żadnych pól. | Klasa abstrakcyjna może mieć zdefiniowane pola i stałe. |
Jędrność | Stałe deklaracje w interfejsie są przypuszczalnie publicznym końcem statycznym. | Współdzielony kod można dodać do klasy abstrakcyjnej. |
Stałe | Tylko statyczne stałe końcowe, mogą używać ich bez kwalifikacji w klasach implementujących interfejs. | Możliwe są zarówno stałe instancji, jak i statyczne. Zarówno statyczny jak i instancyjny kod inicjujący są również możliwe do obliczenia stałych. |
Wygoda dla osób trzecich | Implementację interfejsu można dodać do dowolnej istniejącej klasy strony trzeciej. | Klasa strony trzeciej musi zostać przepisana, aby rozciągać się tylko od klasy abstrakcyjnej. |
is-a vs.able lub can-do | Interfejsy są często używane do opisania peryferyjnych zdolności danej klasy, a nie jej centralnej tożsamości, np. Klasa Automobile może implementować interfejs Recyklingu, który może być zastosowany do wielu innych, całkowicie niezwiązanych ze sobą obiektów. | Klasa abstrakcyjna definiuje rdzeń tożsamości swoich potomków. Wdrożone interfejsy wymieniają ogólne rzeczy, które klasa może robić, a nie rzeczy, które są klasą. W kontekście Java użytkownicy zazwyczaj powinni implementować interfejs Runnable zamiast rozszerzać wątek, ponieważ nie są naprawdę zainteresowani zapewnieniem nowej funkcji Thread, zwykle chcą, aby jakiś kod posiadał możliwość niezależnego działania. Chcą stworzyć coś, co można uruchomić w wątku, a nie nowy rodzaj wątku. Podobny jest a kontra ma - debata pojawia się, gdy zdecydujesz się dziedziczyć lub delegować. |
Podłącz | Użytkownik może napisać nowy moduł zastępujący dla interfejsu, który nie zawiera wspólnego kija wspólnego z istniejącymi implementacjami. Kiedy użytkownik implementuje interfejs, zaczyna od zera bez żadnej domyślnej implementacji. Użytkownik musi uzyskać narzędzia z innych klas; nic nie ma interfejsu innego niż kilka stałych. Daje to użytkownikowi swobodę realizacji radykalnie odmiennego projektu wewnętrznego. | Użytkownik musi korzystać z abstrakcyjnej klasy, tak jak jest to dla kodu bazowego, ze wszystkimi powiązanymi z nią bagażami, dobrymi lub złymi. Autor klas abstrakcyjnych narzucił strukturę użytkownikowi. |
Konserwacja | Jeśli kod klienta mówi tylko pod kątem interfejsu, możesz łatwo zmienić konkretną implementację za pomocą metody fabrycznej. | Jeśli kod klienta mówi tylko w kategoriach klasy abstrakcyjnej, możesz łatwo zmienić konkretną implementację za pomocą metody fabrycznej. |