Modulelessen (1/2)
Interfaces
Hoewel abstracte klassen zowel gedeeltelijk geïmplementeerde code als instancevelden kunnen bevatten, zijn interfaces in Java contracten van puur gedrag. Een interface definieert wat een klasse moet kunnen doen, maar niet hoe hij dat doet.
Dit maakt een volledige ontkoppeling mogelijk tussen de definitie van operaties en de daadwerkelijke implementatie ervan.
Een interface definiëren (interface)
We gebruiken het trefwoord interface. Alle methoden die in een interface worden gedeclareerd, zijn impliciet public en abstract (het is niet nodig om dit te specificeren):
interface Drivable {
void startEngine();
void stopEngine();
}Een interface implementeren (implements)
Een klasse implementeert een interface met behulp van het sleutelwoord implements en is vereist om de implementatie (met een body) te leveren voor alle gedefinieerde methoden:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}Voordelen van interfaces
- Meervoudige overerving: in Java kan een klasse slechts één bovenliggende klasse uitbreiden (enkele overerving), maar hij kan meerdere interfaces tegelijkertijd implementeren.
Java
class HybridCar implements Drivable, Chargeable { ... } - Ontkoppeling: u kunt variabelen definiëren met behulp van het interfacetype. Elk object dat deze interface implementeert, kan aan een dergelijke variabele worden toegewezen.
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
Constanten in interfaces
In interfaces is het mogelijk om velden te declareren. Deze velden zijn impliciet public static final (wat klasseconstanten betekent), zelfs als u deze modifiers niet opgeeft. Daarom moeten ze onmiddellijk na de aangifte worden geïnitialiseerd:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}Standaardmethoden (default)
Vanaf Java 8 is het mogelijk om methoden met een standaardimplementatie binnen een interface te definiëren met behulp van het trefwoord default. Deze methoden dwingen de implementerende klassen niet om ze te overschrijven, waardoor een terugvalgedrag ontstaat:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}Probeer het zelf
Maak een Flyable-interface met een void fly() -methode. Implementeer vervolgens een Bird-klasse die Flyable implementeert en Flying naar het scherm afdrukt.
Toon hint
In Flyable schrijf je `void fly();`. Implementeer in de klasse Bird de methode die deze markeert met `@Override public void fly() { System.out.println('Flying'); }`.
Oplossing beschikbaar na 3 pogingen
Definieer een Drawable-interface met een void draw() -methode. Implementeer vervolgens een Rectangle-klasse die Drawable implementeert en Drawing Rectangle afdrukt.
Toon hint
Definieer `void draw();` in de interface. Gebruik in Rechthoek `@Override public void draw() { System.out.println('Rechthoek tekenen'); }`.
Oplossing beschikbaar na 3 pogingen
Voltooi de Swimmable-interface door de void swim() -methode te definiëren. Voltooi vervolgens de klasse Duck zodat deze zowel Flyable als Swimmable implementeert, door de methode Flying in the fly() en Swimming in the swim() af te drukken.
Toon hint
Declareer `void swim();` binnen Swimmable. Declareer 'klasse Duck implementeert Flyable, Swimmable' en implementeer beide methoden door de gevraagde strings af te drukken.
Oplossing beschikbaar na 3 pogingen