Hoewel zowel extends als implements keyword in Java wordt gebruikt om Inheritance concept van Object-Oriented programmeren uit te voeren, is er een subtiel verschil tussen beide. Het extends sleutelwoord wordt hoofdzakelijk gebruikt om een klasse uit te breiden, d.w.z. om een subklasse in Java te creëren, terwijl het implements sleutelwoord wordt gebruikt om een interface in Java te implementeren. Het extends keyword kan ook gebruikt worden door een interface om een andere interface uit te breiden. Om het verschil tussen extends en implements beter te begrijpen, moet je ook het verschil tussen class en interface in Java leren en begrijpen.
Hoewel beide een integraal onderdeel zijn van applicatie-ontwikkeling met behulp van de object-georiënteerde methodologie, is een interface abstracter dan een klasse, vandaar dat het wordt gebruikt om API of contract te definiëren.
Aan de andere kant, een klasse biedt de concrete implementatie van de interface, dat wil zeggen de eigenlijke code die het werk doet. Hoewel een klasse ook abstract kan zijn om een contract te definiëren, wordt dit werk in Java het best gedaan door een interface. Zelfs Joshua Bloch heeft in Effective Java geadviseerd om interfaces te gebruiken om Type in Java te declareren, omdat het meervoudige overerving in Java bevordert, wat beperkt is in vergelijking met C++.
Zelfs na Java 8, wordt alleen meervoudige overerving van type en gedrag ondersteund in Java (door de introductie van standaard methoden in Java 8), maar meervoudige overerving van de staat wordt nog steeds niet ondersteund. Als je meer wilt weten over waarom meervoudige overerving niet wordt ondersteund in Java, zie dan hier.
En, als je nieuw bent in de Java wereld dan raad ik je ook aan om The Complete Java MasterClass op Udemy door te nemen om Java op een betere en meer gestructureerde manier te leren. Dit is een van de beste en meest recente cursussen om Java online te leren.
Wat is de betekenis van het uitbreiden van een klasse
Een klasse in Java kan een andere klasse uitbreiden en zo een subklasse worden. Als klasse B klasse A uitbreidt, wordt B een subklasse (kind) en A een superklasse (ouder). Een subklasse kan alle eigenschappen van de ouder klasse hergebruiken en code hergebruik is een belangrijke reden om een klasse uit te breiden, maar weinigen begrijpen dat belangrijker de definiërende relatie is die later door Polymorfisme wordt gebruikt.
Bij voorbeeld, als klasse B klasse A uitbreidt dan kan een referentie variabele van het type A het object van B bevatten, wat betekent dat A nu polymorf wordt omdat het zowel A als B kan bevatten. Hieruit ontstaat een techniek om flexibele software te maken, bekend als programmeren voor interface dan implementatie, waarbij je altijd variabelen van de bovenliggende klasse of interface gebruikt om het kernalgoritme te definiëren.
Het voordeel hiervan is dat elke nieuwe klasse die de bovenliggende klasse uitbreidt, toegang heeft tot dat algoritme.
Hier volgt een voorbeeld van het uitbreiden van een klasse in Java:
klasse A { public void show() { System.out.println("show"); }}klasse B is een uitbreiding van A { public void display() { System.out.println("display"); } public void show() { System.out.println("beter tonen"); }}public class Main { public static void main(String args) { A a = new B(); // mogelijk omdat B A uitbreidt a.show(); // dit zal nu de show() methode van klasse B aanroepen }}Outputbetere show
Je ziet dat door klasse A uit te breiden, B nu toegang heeft tot de show() methode, het kan zelfs het gedrag van de show() methode overriden, wat bekend staat als method overriding in Java. Deze immense kracht komt door het gebruik van het extends keyword.
Je kunt ook het Head First Design Pattern in Java lezen om meer te leren over de techniek van programmeren voor interface dan implementatie. Het boek is onlangs bijgewerkt met Java SE 8.
Wat is de betekenis van het implementeren van een interface
De betekenis van het implementeren van een interface is niet veel anders dan het uitbreiden van een klasse, maar het komt met een extra voorbehoud. Wanneer een klasse een interface implementeert, moet ze een implementatie voorzien van alle methodes die in de interface zijn gedeclareerd. Als ze niet alle methodes wil implementeren, kan ze zichzelf verklaren als een abstracte klasse.
Als je deze regels niet volgt, kan je programma niet compileren. Er zijn veel voorbeelden van het implementeren van een interface in Java code, maar ik denk dat het implementeren van Runnable het meest populair is. Deze wordt gebruikt om een Runnable-taak te maken die door een thread kan worden uitgevoerd.
class R implements Runnable{public void run(){ System.out.println("niets doen"); }}
Een instantie van R kan nu worden doorgegeven aan elke methode die een Runnable verwacht, zoals je deze kunt doorgeven aan zowel de execute() als de submit() methode van de ExecutorService class om die taak in een thread pool uit te voeren. Aangezien onze klasse de run() methode heeft geïmplementeerd, de enige methode van interface Runnable, is het een concrete klasse. Als hij de run() methode niet had geïmplementeerd, moet je hem abstract maken door het abstract keyword voor de class te zetten, bijv.
abstracte klasse R implementeert Runable{}
Belangrijke punten
Hier volgen enkele belangrijke punten in verband met het sleutelwoord extends en implementments in Java:
1) Een klasse kan alleen een andere klasse in Java uitbreiden, het gebruik van het sleutelwoord extends met de interface zal resulteren in een compilatiefout zoals hieronder getoond:
interface I{}klasse A{}klasse B breidt A{}klasse C breidt I{}
Wanneer u dit bronbestand compileert, krijgt u de volgende foutmelding:
$ javac Main.javaMain.java:27: no interface expected hereclass C extends I{^1 error
2) Een klasse kan slechts één klasse uitbreiden, als u meer dan één klasse probeert uit te breiden, krijgt u opnieuw een compilatiefout zoals hieronder getoond:
class C extends A, B{}$ javac Main.javaMain.java:27: '{' expectedclass C extends A, B{^1 error
3) Een interface kan het extends sleutelwoord gebruiken om subinterfaces te maken in Java, bijv.g. Het volgende is volkomen legaal in Java
interface J breidt I uit{}
4) Een interface kan zelfs meerdere interfaces uitbreiden door het extends sleutelwoord te gebruiken zoals hieronder getoond:
interface k breidt I, J uit{}
5) Een klasse kan het implements sleutelwoord gebruiken om een of meer interfaces in Java te implementeren zoals hieronder getoond:
klasse D implementeert I, J, K{}
6) Een klasse kan ook zowel het extends- als het implementsleutelwoord gebruiken om een klasse uit te breiden en een interface te implementeren, dit komt vaak voor in Java, zoals te zien is in het volgende voorbeeld:
klasse E breidt A uit implementeert I, J{}
Wanneer een klasse dat doet, is het nu een subklasse van A en subinterface van I en J, wat betekent dat je een referentievariabele van klasse E en interface I, J kunt gebruiken om een object van klasse E op te slaan, zoals hieronder wordt getoond:
I i = new E();J j = new E();A a = new E();
Dit geeft de klasse E een immense kracht in termen van het gebruik van Inheritance en Polymorphism.
7) Last but not the least: een interface kan geen implements keyword gebruiken om een interface te implementeren, dat is illegaal in Java en de compiler zal een fout geven zoals hieronder te zien is:
interface L implements J{}javac Main.javaMain.java:49: '{' expectedinterface L implements J{^1 error
Dat is alles over het verschil tussen extends en implements keyword in Java. Het is duidelijk dat extends over het algemeen wordt gebruikt om een klasse uit te breiden en implements wordt over het algemeen gebruikt om een interface te implementeren. Hoewel er meer subtiliteiten zijn, b.v. een interface kan ook een andere interface uitbreiden om een subinterface te worden, een klasse kan ook abstract zijn zelfs na het implementeren van een interface, maar wat niet verandert is dat ze beide worden gebruikt om de ouder-kind relatie in Java te creëren.
Als klasse B een andere klasse A uitbreidt, wordt het zijn kinderen en wordt klasse A een ouder. Hetzelfde geldt voor de interface. Je kunt Head First Java en Head First Object-Oriented Analysis verder lezen om meer te leren over de basisbouwstenen van Object-Oriented programmeren in Java.
Andere Java Interview Vragen die je misschien leuk vindt
- Het verschil tussen Aggregatie, Associatie en Compositie in Java? (antwoord)
- Het verschil tussen Abstracte klasse en Interface in Java? (antwoord)
- Het verschil tussen Inheritance en Polymorphism in Java? (antwoord)
- Het verschil tussen Abstractie en Polymorfisme in Java? (antwoord)
- Waarom is Compositie beter dan Inheritance in Java? (artikel)
- Het verschil tussen statische en niet-statische variabelen in Java? (antwoord)
- Waarom is een abstracte klasse belangrijk in Java? (mening)
Verder leren
Volledige Java Masterclass
Java Fundamentals: De Java Taal
Java In-Depth: Word een complete Java Engineer!