Chociaż oba słowa kluczowe extends i implements w Javie są używane do implementacji koncepcji dziedziczenia w programowaniu zorientowanym obiektowo, istnieje między nimi subtelna różnica. Słowo kluczowe extends jest głównie używane do rozszerzania klasy, tj. do tworzenia podklas w Javie, podczas gdy słowo kluczowe implements jest używane do implementacji interfejsu w Javie. Słowo kluczowe extends może być również użyte przez interfejs do rozszerzenia innego interfejsu. Aby lepiej zrozumieć różnicę między extends i implements, musisz również nauczyć się i zrozumieć różnicę między klasą i interfejsem w Javie.
Chociaż oba są integralną częścią rozwoju aplikacji przy użyciu metodologii obiektowej, interfejs jest bardziej abstrakcyjny niż klasa, stąd jest używany do definiowania API lub kontraktu.
Z drugiej strony, klasa zapewnia konkretną implementację interfejsu, tj. rzeczywisty kod, który wykonuje zadanie. Chociaż klasa może być również abstrakcyjna, aby zdefiniować kontrakt, jest to zadanie najlepiej wykonane przez interfejs w Javie. Nawet Joshua Bloch doradził w Effective Java o używaniu interfejsów do deklarowania typów w Javie, ponieważ promuje wielokrotne dziedziczenie w Javie, które jest ograniczone w porównaniu do C ++.
Nawet po Java 8, tylko wielokrotne dziedziczenie typu i zachowania jest obsługiwane w Javie (poprzez wprowadzenie domyślnych metod w Javie 8), ale wielokrotne dziedziczenie stanu nadal nie jest obsługiwane. Jeśli chcesz dowiedzieć się więcej o tym, dlaczego wielokrotne dziedziczenie nie jest obsługiwane w Javie, zobacz tutaj.
And, Jeśli jesteś nowy w świecie Java, to polecam również przejść przez The Complete Java MasterClass na Udemy, aby nauczyć się Java w lepszy i bardziej uporządkowany sposób. Jest to jeden z najlepszych i aktualnych kursów do nauki Javy online.

Jakie jest znaczenie rozszerzania klasy

Klasa w Javie może rozszerzyć inną klasę, aby stać się podklasą. Kiedy klasa B rozszerza klasę A, B staje się podklasą (dzieckiem), a A staje się nadklasą (rodzicem). Podklasa może ponownie wykorzystać wszystkie cechy klasy nadrzędnej i ponowne wykorzystanie kodu jest głównym powodem rozszerzania klasy, ale niewielu rozumie, że ważniejsza jest relacja definiowania, która jest później wykorzystywana przez polimorfizm.
Na przykład, jeśli klasa B rozszerza klasę A, wtedy zmienna referencyjna typu A może przechowywać obiekt B, co oznacza, że A teraz staje się polimorficzna, ponieważ może przechowywać zarówno A, jak i B. To daje początek technice tworzenia elastycznego oprogramowania, znanej jako programowanie dla interfejsu niż implementacji, gdzie zawsze używasz zmiennych klasy nadrzędnej lub interfejsu do zdefiniowania algorytmu rdzenia.

Korzyść z tego jest taka, że każda nowa klasa, która rozszerza klasę nadrzędną, będzie miała dostęp do tego algorytmu.
Tutaj przykład rozszerzenia klasy w Javie:

class A { public void show() { System.out.println("pokaż"); }}class B extends A { public void display() { System.out.println("wyświetl"); } public void show() { System.out.println("lepiej pokaż"); }}public class Main { public static void main(String args) { A a = new B(); // możliwe, ponieważ B rozszerza A a.show(); // spowoduje to teraz wywołanie metody show() klasy B }} Outputbetter show

Widzisz, że poprzez rozszerzenie klasy A, B ma teraz dostęp do metody show(), może nawet nadpisać zachowanie metody show(), co jest znane jako nadpisywanie metod w Javie. Ta ogromna moc pochodzi z użycia słowa kluczowego extends.
Możesz również przeczytać Head First Design Pattern w Javie, aby dowiedzieć się więcej o technice programowania dla interfejsu niż implementacji. Książka jest również niedawno zaktualizowana, aby objąć Java SE 8.

Jakie jest znaczenie implementacji interfejsu

Znaczenie implementacji interfejsu nie różni się zbytnio od rozszerzania klasy, ale wiąże się z dodatkowym zastrzeżeniem. Kiedy klasa implementuje interfejs, musi zapewnić implementację wszystkich metod zadeklarowanych wewnątrz interfejsu. Jeśli nie chce dostarczać wszystkich implementacji, może zadeklarować się jako klasa abstrakcyjna.
Nieprzestrzeganie tych zasad oznacza, że Twój program nie może się skompilować. Istnieje wiele przykładów implementacji interfejsu w kodzie Java, ale uważam, że implementacja Runnable jest najbardziej popularna. Służy ona do tworzenia zadania Runnable, które może być wykonywane przez wątek.

class R implementuje Runnable{public void run(){ System.out.println("do nothing"); }}

Instancję R można teraz przekazać do dowolnej metody, która oczekuje Runnable, np. można ją przekazać zarówno do metody execute(), jak i submit() klasy ExecutorService, aby uruchomić to zadanie w puli wątków. Ponieważ nasza klasa zaimplementowała metodę run(), jedyną metodę z interfejsu Runnable, jest ona klasą konkretną. Gdyby nie miała zaimplementowanej metody run() musisz uczynić ją abstrakcyjną poprzez dodanie słowa kluczowego abstract przed klasą np.

abstrakcyjna klasa R implementuje Runnable{}

Ważne punkty

Oto niektóre z ważnych punktów związanych ze słowami kluczowymi extends i implements w Javie:
1) Klasa może tylko rozszerzyć inną klasę w Javie, użycie słowa kluczowego extends z interfejsem spowoduje błąd kompilacji, jak pokazano poniżej:

interface I{}class A{}class B extends A{}class C extends I{}

Kiedy skompilujesz ten plik źródłowy, otrzymasz następujący błąd:

$ javac Main.javaMain.java:27: no interface expected hereeclass C extends I{^1 error

2) Klasa może rozszerzyć tylko jedną klasę, próba rozszerzenia więcej niż klasy ponownie spowoduje błąd kompilacji, jak pokazano poniżej:

class C extends A, B{}$ javac Main.javaMain.java:27: '{' expectedclass C extends A, B{^1 error

3) Interfejs może używać słowa kluczowego extends do tworzenia podinterfejsów w Javie np.g. poniższe jest całkowicie legalne w Javie

interface J extends I{}

4) Interfejs może nawet rozszerzyć wiele interfejsów poprzez użycie słowa kluczowego extends, jak pokazano poniżej:

interface k extends I, J{}

5) Klasa może użyć słowa kluczowego implements do implementacji jednego lub więcej interfejsów w Javie, jak pokazano poniżej:

class D implements I, J, K{}

6) Klasa może również użyć zarówno słowa kluczowego extends jak i implements razem, aby rozszerzyć klasę i zaimplementować interfejs, jest to dość powszechne w Javie, jak pokazano na poniższym przykładzie:

class E extends A implements I, J{}

Gdy klasa to robi, jest teraz podklasą A i podinterfejsem I i J, co oznacza, że możesz użyć zmiennej referencyjnej klasy E i interfejsu I, J do przechowywania obiektu klasy E, jak pokazano poniżej:

I i = new E();J j = new E();A a = new E();

To daje ogromną moc klasie E w zakresie stosowania Dziedziczenia i Polimorfizmu.
7) Ostatni, ale nie najmniej ważny, interfejs nie może używać słowa kluczowego implements do implementacji interfejsu, jest to nielegalne w Javie i kompilator wyrzuci błąd, jak pokazano poniżej:

interface L implements J{}javac Main.javaMain.java:49: '{' expectedinterface L implements J{^1 error

To wszystko o różnicy między extends i implements słowo kluczowe w Javie. Jasne jest, że extends jest generalnie używane do rozszerzenia klasy, a implements jest generalnie używane do implementacji interfejsu. Chociaż istnieje więcej subtelności, np. interfejs może również rozszerzyć inny interfejs, aby stać się podinterfejsem, klasa może również być abstrakcyjna nawet po zaimplementowaniu interfejsu, ale to, co się nie zmienia, to fakt, że oba są używane do tworzenia relacji rodzic-dziecko w Javie.
Jeśli klasa B rozszerza inną klasę A, staje się jej dziećmi, a klasa A staje się rodzicem. To samo jest prawdziwe z interfejsem. Możesz dalej czytać Head First Java i Head First Object-Oriented Analysis, aby dowiedzieć się więcej o podstawowych elementach składowych programowania obiektowego w Javie.
Inne pytania kwalifikacyjne Java, które mogą Ci się spodobać

  • Różnica między Aggregacją, Asocjacją i Kompozycją w Javie? (odpowiedź)
  • Różnica między klasą abstrakcyjną a interfejsem w Javie? (odpowiedź)
  • Różnica między dziedziczeniem a polimorfizmem w Javie? (odpowiedź)
  • Różnica między abstrakcją a polimorfizmem w Javie? (odpowiedź)
  • Dlaczego kompozycja jest lepsza niż dziedziczenie w Javie? (artykuł)
  • Różnica między zmiennymi statycznymi i niestatycznymi w Javie? (odpowiedź)
  • Dlaczego klasa abstrakcyjna jest ważna w Javie? (opinia)

Dalsza nauka
Kompletny kurs Java Masterclass
Podstawy języka Java: The Java Language
Java In-Depth: Zostań kompletnym inżynierem Java!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.