Implementazione delle interfacce
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 35 di 87.
Per usare un'interfaccia, una classe deve implementarla usando la parola chiave implements. La classe fornisce quindi implementazioni concrete per tutti i metodi dichiarati nell'interfaccia:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}Se una classe implementa un'interfaccia ma non fornisce implementazioni per tutti i suoi metodi, il compilatore genererà un errore. L'annotazione @Override è facoltativa, ma consigliata perché aiuta a individuare gli errori.
Proprio come con le classi astratte, puoi usare un'interfaccia come tipo di riferimento. Questo consente il polimorfismo, per cui classi diverse che implementano la stessa interfaccia possono essere trattate in modo uniforme:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // Disegno di un cerchio con raggio 5.0
shape2.draw(); // Disegno di un rettangolo 4.0 x 3.0Questo è potente perché il codice che lavora con i riferimenti a Drawable non deve conoscere il tipo specifico della classe. Gli importa solo che l'oggetto possa essere disegnato.
Nella prossima lezione vedrai come una singola classe può implementare più interfacce contemporaneamente.
Sfida
FacileCreiamo un sistema di altoparlanti che dimostri come le classi implementano le interfacce. Creerai un'interfaccia che definisce cosa può fare qualsiasi altoparlante, poi creerai due tipi diversi di altoparlanti, ognuno dei quali implementa questo contratto a modo suo.
Organizzerai il codice in quattro file:
Speaker.java: Definisci un'interfaccia chiamataSpeakerche dichiara cosa deve poter fare qualsiasi altoparlante. Ogni altoparlante dovrebbe avere un metodospeak()che restituisce una String. Questo è il contratto che tutte le classi che implementano l'interfaccia devono rispettare.Human.java: Crea una classe che implementa l'interfacciaSpeaker. Un Human ha un camponame(String). Includi un costruttore per inizializzare il nome e implementa il metodospeak()affinché restituisca:[name] says: Hello everyone!Robot.java: Crea un'altra classe che implementa l'interfacciaSpeaker. Un Robot ha un campomodel(String). Includi un costruttore per inizializzare il modello e implementa il metodospeak()affinché restituisca:Robot [model] says: Beep boop!Main.java: Metti insieme ogni elemento usando il polimorfismo basato sulle interfacce. Riceverai due input: il nome di una persona e il modello di un robot. Crea un Human e un Robot, poi memorizzali in un array di riferimentiSpeaker. Scorri l'array e stampa il risultato della chiamata aspeak()su ciascun altoparlante.
Riceverai due input: il nome della persona (String) e il modello del robot (String).
L'output dovrebbe mostrare due righe: una per ogni altoparlante. Nota come sia Human sia Robot possano essere trattati in modo uniforme tramite l'interfaccia Speaker, anche se parlano in modi completamente diversi!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi gli input
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO: Crea un oggetto Human con il nome fornito
// TODO: Crea un oggetto Robot con il modello fornito
// TODO: Crea un array di riferimenti a Speaker contenente entrambi gli oggetti
// TODO: Scorri l'array e stampa il risultato di speak() per ogni Speaker
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online