Proszę wyjaśnić w łatwym do zrozumienia języku lub link do jakiegoś artykułu.
java
inheritance
interface
extends
implements
Saad Masood
źródło
źródło
Odpowiedzi:
extends
służy do rozszerzenia klasy.implements
służy do implementacji interfejsuRóżnica między interfejsem a zwykłą klasą polega na tym, że w interfejsie nie można zaimplementować żadnej z zadeklarowanych metod. Tylko klasa, która „implementuje” interfejs może implementować metody. Odpowiednikiem interfejsu w C ++ byłaby klasa abstrakcyjna (NIE DOKŁADNIE taka sama, ale w zasadzie).
Również Java nie obsługuje wielokrotnego dziedziczenia klas. Można to rozwiązać za pomocą wielu interfejsów.
teraz rozszerzając klasę
w tym przypadku
Sugeruję, abyś przeprowadził więcej badań nad dynamicznym wiązaniem, polimorfizmem i ogólnie dziedziczeniem w programowaniu obiektowym
źródło
default
zachowania metod w interfejsach, dzięki czemu niestandardowa implementacja tych metod jest opcjonalna. Dlatego stwierdzenie „możesz tylko określić metody, ale nie wdrożyć ich” jest w pełni poprawne tylko dla Javy 7 i niższych .public interface ListIterator<E> extends Iterator<E>
Zauważyłem, że masz kilka pytań w C ++ w swoim profilu. Jeśli rozumiesz pojęcie wielokrotnego dziedziczenia po C ++ (odnoszące się do klas, które dziedziczą cechy z więcej niż jednej innej klasy), Java nie pozwala na to, ale ma słowo kluczowe
interface
, które jest w C ++ czymś w rodzaju czystej klasy wirtualnej. Jak wspomniało wiele osób, jesteśextend
klasą (i możesz rozszerzyć tylko z jednej), a tyimplement
interfejsem - ale twoja klasa może implementować tyle interfejsów, ile chcesz.Tzn. Te słowa kluczowe i reguły rządzące ich użyciem określają możliwości wielokrotnego dziedziczenia w Javie (możesz mieć tylko jedną superklasę, ale możesz zaimplementować wiele interfejsów).
źródło
Ogólnie implementuje używane do implementacji interfejsu i rozszerzeń używanych do rozszerzenia zachowania klasy bazowej lub klasy abstrakcyjnej .
extends : klasa pochodna może rozszerzyć klasę podstawową. Możesz przedefiniować zachowanie ustanowionej relacji. Klasa pochodna „ jest ” typem klasy podstawowej
implementuje : wdrażasz umowę. Klasa implementująca interfejs „ ma ” zdolność.
W wersji java 8 interfejs może mieć domyślne metody w interfejsie, co zapewnia implementację w samym interfejsie.
Sprawdź, kiedy używać każdego z nich:
Interfejs vs Klasa abstrakcyjna (ogólne OO)
Przykład zrozumienia rzeczy.
wynik:
Ważne punkty do zrozumienia:
remember
() iprotectOwner
(), dzieląc sięname,lifeExpentency
zAnimal
Cat
iDog
poprzez implementację tej możliwości.Think,Learn,Apply,Climb
Przechodząc przez te przykłady, możesz to zrozumieć
Klasy niezwiązane mogą mieć możliwości poprzez interfejs, ale klasy pokrewne nadpisują zachowanie poprzez rozszerzenie klas podstawowych.
źródło
extends
jest przeznaczony do dziedziczenia po klasie podstawowej (tj. rozszerzeniu jej funkcjonalności).implements
jest przeznaczony do implementacji interfejsu .Oto dobre miejsce na rozpoczęcie: interfejsy i dziedziczenie .
źródło
class
Tylko można „wdrożyć” aninterface
. Klasa tylko „rozszerza” aclass
. Podobnieinterface
może przedłużyć innyinterface
.A
class
może przedłużać tylko jeden innyclass
. Aclass
może zaimplementować kilkainterface
s.Jeśli zamiast tego bardziej interesuje Cię wiedza, kiedy użyć
abstract class
es iinterface
s, zapoznaj się z tym wątkiem: Interfejs vs Klasa abstrakcyjna (ogólne OO)źródło
class
może wdrożyć tylko jedeninterface
. Aclass
może rozszerzyć kilka innych klas. Wierzę, że dostałeś to wstecz.Interfejs to opis działań, które może wykonywać obiekt ... na przykład po naciśnięciu przełącznika światła światło się zapala, nie obchodzi cię, jak to działa. W programowaniu obiektowym interfejs to opis wszystkich funkcji, które musi posiadać obiekt, aby mógł być „X”. Ponownie, na przykład, wszystko, co „ACTS LIKE” światło, powinno mieć metodę turn_on () i metodę turn_off (). Interfejsy mają na celu umożliwienie komputerowi wymuszenia tych właściwości oraz wiedzy, że obiekt TYPU T (niezależnie od interfejsu) musi mieć funkcje o nazwach X, Y, Z itp.
Interfejs to struktura / składnia programowania, która umożliwia komputerowi wymuszanie określonych właściwości obiektu (klasy). Załóżmy na przykład, że mamy klasę samochodów, klasę skuterów i klasę ciężarówek. Każda z tych trzech klas powinna mieć akcję start_engine (). Sposób, w jaki „silnik jest uruchamiany” dla każdego pojazdu, jest pozostawiony poszczególnym klasom, ale fakt, że muszą one mieć działanie start_engine, jest domeną interfejsu .
źródło
Jak pokazano na poniższym rysunku, klasa rozszerza inną klasę, interfejs rozszerza inny interfejs, ale klasa implementuje interfejs.
Po więcej szczegółów
źródło
Rozszerza : służy do przeniesienia atrybutów klasy nadrzędnej do klasy podstawowej i może zawierać już zdefiniowane metody, które można zastąpić w klasie podrzędnej.
Implementuje : służy do implementacji interfejsu (klasa nadrzędna tylko z podpisami funkcji, ale nie ich definicjami) poprzez zdefiniowanie go w klasie potomnej.
Jest jeden specjalny warunek: „Co jeśli chcę, aby nowy interfejs był dzieckiem istniejącego interfejsu?”. W powyższym stanie interfejs potomny rozszerza interfejs macierzysty.
źródło
A rozszerza B:
A i B to obie klasy lub oba interfejsy
A implementuje B.
A to klasa, a B to interfejs
Pozostały przypadek, w którym A jest interfejsem, a B jest klasą, nie jest legalny w Javie.
źródło
Implementacje są używane w interfejsach, a extends służą do rozszerzania klasy.
Aby uczynić go bardziej zrozumiałym w prostszych terminach, interfejs wygląda tak, jak brzmi - interfejs - model, który należy zastosować, podążać wraz z Twoimi pomysłami na niego.
Rozszerzenie służy do klas, tutaj rozszerzasz coś, co już istnieje, dodając do niego więcej funkcji.
Jeszcze kilka notatek:
interfejs może rozszerzyć inny interfejs.
A kiedy musisz wybrać pomiędzy implementacją interfejsu lub rozszerzeniem klasy dla konkretnego scenariusza, przejdź do implementacji interfejsu. Ponieważ klasa może implementować wiele interfejsów, ale rozszerzyć tylko jedną klasę.
źródło
Gdy podklasa rozszerza klasę, pozwala ona dziedziczyć (ponownie wykorzystywać) i zastępować kod zdefiniowany w nadtypie. Kiedy klasa implementuje interfejs, pozwala na użycie obiektu utworzonego z klasy w dowolnym kontekście, który oczekuje wartości interfejsu.
Prawdziwy haczyk polega na tym, że chociaż wdrażamy wszystko, oznacza to po prostu, że używamy tych metod takimi, jakimi są. Nie ma możliwości zmiany ich wartości i typów zwracanych.
Ale kiedy coś przedłużamy, staje się przedłużeniem twojej klasy. Możesz go zmienić, użyć, użyć ponownie, użyj go i niekoniecznie musi zwracać te same wartości, co w nadklasie.
źródło
Używamy podklasy rozciąga SuperClass tylko wtedy, gdy podklasa chce wykorzystać niektóre funkcje (metody lub zmiennych instancji), który jest już zadeklarowana w SuperClass , lub jeśli chcesz nieznacznie zmodyfikować funkcjonalność SuperClass (Metoda nadrzędne). Powiedzmy na przykład, że mam klasę Animal ( SuperClass ) i Dog ( SubClass ) i istnieje kilka metod, które zdefiniowałem w klasie Animal, np. doEat (); , doSleep (); ... i wiele więcej.
Teraz moja klasa Dog może po prostu rozszerzyć klasę Animal, jeśli chcę, aby mój pies używał dowolnej metody zadeklarowanej w klasie Animal, mogę wywoływać te metody, po prostu tworząc obiekt Dog. W ten sposób mogę zagwarantować, że mam psa, który może jeść i spać i robić wszystko, co chcę, aby pies to zrobił.
Teraz wyobraź sobie, że pewnego dnia jakiś miłośnik kotów wchodzi do naszego miejsca pracy i próbuje rozszerzyć klasę zwierząt (koty też jedzą i śpią). Robi obiekt Cat i zaczyna wywoływać metody.
Ale powiedzmy, że ktoś próbuje stworzyć obiekt klasy Animal. Możesz powiedzieć, jak śpi kot, możesz powiedzieć, jak pies je, możesz powiedzieć, jak pije słoń. Ale nie ma sensu tworzyć obiektu klasy Animal. Ponieważ jest to szablon i nie chcemy żadnego ogólnego sposobu jedzenia.
Zamiast tego wolę stworzyć klasę abstrakcyjną, której nikt nie będzie mógł utworzyć, ale może być użyty jako szablon dla innych klas.
Podsumowując, interfejs jest niczym innym jak klasą abstrakcyjną (czystą klasą abstrakcyjną), która nie zawiera żadnych implementacji metod, a jedynie definicje (szablony). Więc ktokolwiek implementuje interfejs, wie tylko, że ma szablony doEat (); i doSleep (); ale muszą zdefiniować własne doEat (); i doSleep (); metody według ich potrzeb.
Rozszerzasz tylko wtedy, gdy chcesz ponownie wykorzystać część SuperClass (ale pamiętaj, że zawsze możesz zastąpić metody SuperClass zgodnie z potrzebami) i wdrażasz, kiedy chcesz szablony i chcesz je zdefiniować samodzielnie (w zależności od potrzeb).
Podzielę się z tobą fragmentem kodu: wypróbujesz go z różnymi zestawami danych wejściowych i spojrzysz na wyniki.
Zdefiniowane interfejsy :
źródło
Oba słowa kluczowe są używane podczas tworzenia własnej nowej klasy w języku Java.
Różnica:
implements
oznacza, że używasz elementów interfejsu Java w swojej klasie.extends
oznacza, że tworzysz podklasę rozszerzanej klasy podstawowej. Możesz rozszerzyć tylko jedną klasę w klasie podrzędnej, ale możesz zaimplementować tyle interfejsów, ile chcesz.Więcej informacji znajduje się na stronie dokumentacji Oracle w interfejsie .
Pomoże to wyjaśnić, czym jest interfejs i jakie są konwencje korzystania z niego.
źródło
W najprostszych terminach ext służy do dziedziczenia po klasie, a implementacja służy do zastosowania interfejsu w klasie
rozszerza :
wdraża :
jeśli nadal masz wątpliwości, przeczytaj to: https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html
źródło
Klasy i interfejsy są umowami . Zapewniają metody i właściwości, na których opiera się inna część aplikacji.
Interfejs definiuje się , gdy nie są Państwo zainteresowani szczegółami realizacji tej umowy. Jedyne, na co należy zwrócić uwagę, to to, że umowa (interfejs) istnieje.
W takim przypadku należy pozostawić to klasie, która implementuje interfejs, aby dbał o szczegóły dotyczące realizacji umowy. Tylko klasy mogą implementować interfejsy.
Przedłużenie jest używane, gdy chcesz zastąpić szczegóły istniejącej umowy. W ten sposób zamieniasz jeden sposób na wypełnienie umowy innym sposobem. Klasy mogą rozszerzać inne klasy, a interfejsy mogą rozszerzać inne interfejsy.
źródło
Extends
jest używany, gdy chcesz mieć atrybuty klasy / interfejsu nadrzędnego w klasie / interfejsie podrzędnym iimplements
jest używany, gdy chcesz mieć atrybuty interfejsu w klasie.Przykład:
Rozszerza za pomocą klasy
klasa Parent {
}
klasa Dziecko rozszerza Rodzica {
}
Rozszerza za pomocą interfejsu
interfejs Parent {
}
interfejs Dziecko rozszerza Rodzica {
}
Narzędzia
interfejs A {
}
klasa B implementuje A {
}
Połączenie rozszerzeń i narzędzi
źródło
rozszerza się
narzędzia
klasy abstrakcyjne działają również jak klasa, z rozszerzeniami i implementacjami
źródło
Te dwa słowa kluczowe są bezpośrednio związane z dziedziczeniem, które jest podstawową koncepcją OOP. Kiedy odziedziczymy jakąś klasę do innej klasy, możemy użyć rozszerzeń, ale kiedy zamierzamy odziedziczyć niektóre interfejsy do naszej klasy, nie możemy użyć rozszerzeń, powinniśmy użyć narzędzi i możemy użyć słowa kluczowego rozszerzenia do dziedziczenia interfejsu z innego interfejsu.
źródło