EREDITARIETA’ IN JAVA
INTRODUZIONE
L’ereditarietà in Java sta alla base della OOP. È un pilastro della programmazione OOP che tutti i linguaggi orientati agli oggetti in qualche modo implementano. Si basa sulla generalizzazione che è una relazione tra classi e che consente di organizzare una serie di concetti in una gerarchia, dal quale le classi vengono disposte dalla più particolare alla più generale. L’ereditarietà costituisce di fatto questa relazione fra classi. Vediamo con una immagine come possiamo implementare la generalizzazione in Java.
Si inizia con la keyword class dato che di fatto stiamo creando una classe, seguita dal nome di questa sottoclasse e dalla parola chiave extends che indica che stiamo derivando dalla superclasse, seguita dal nome della superclasse stessa. Java supporta l’ereditarietà singola, cioè possiamo derivare da una sola superclasse a differenza di altri linguaggi come il C++.
Userò due classi per parlare di ereditarietà: AClass e BClass, quest’ultima una specializzazione della prima.
EREDITARIETA’ DEI MEMBRI DI UNA CLASSE
Nella superclasse sono presenti due attributi di istanza, mentre nella classe derivata non è stato definito alcun membro. Una prima cosa che possiamo fare con l’ereditarietà è quella di usare i membri della superclasse nella sottoclasse dato che i membri della superclasse vengono ereditati. Vediamo la classe di test per chiarire il concetto.
Come vedi gli attributi di istanza della superclasse vengono automaticamente ereditati nella sottoclasse. Ora però dobbiamo fare una considerazione. Noi sappiamo che di norma non dobbiamo mai rendere pubblici gli attributi di istanza di una classe, questo per ragioni di sicurezza, rendiamoli privati.
Otteniamo un errore dal compilatore in quanto non si può accedere agli attributi privati neanche da una classe derivata.
In realtà questo è quello che volevamo, creiamo un metodo pubblico nella superclasse per visualizzare gli attributi di istanza.
Vediamo cosa succede se invochiamo il metodo dalla sottoclasse. Come vedi non essendo stati inizializzati gli attributi di istanza della superclasse otteniamo i loro valori di default, false per i boolean e null per le stringhe. La cosa da comprendere è che oltre agli attributi ereditiamo anche i metodi pubblici della superclasse.
COSTRUTTORI ED EREDITARIETA’
Ogni classe in Java può definire i propri costruttori, in presenza di ereditarietà prima viene eseguito il costruttore della superclasse poi quello della sottoclasse.
Vediamo cosa succede con la classe di test.
Succede che alla creazione dell’istanza di BClass viene invocato il costruttore vuoto e senza parametri di AClass, e quindi gli attributi vengono inizializzati. Se però volessimo decidere il valore degli attributi dalla sottoclasse tutto questo sarebbe impossibile con il codice sin qui scritto. Modifichiamo il codice.
Vediamo come deve essere modificata la sottoclasse.
Possiamo nel costruttore senza parametri di BClass invocare il costruttore della classe genitore utilizzando la parola chiave super e passando tra parentesi gli argomenti che inizializzano gli attributi della superclasse. super deve comparire come prima istruzione, questo perché abbiamo detto che prima deve essere costruita l’istanza della superclasse, sarà il compilatore in base agli argomenti passati a scegliere il giusto costruttore della superclasse da chiamare, oppure a generare un errore se non vi è corrispondenza. Vediamo la classe di test.
LINK AI POST PRECEDENTI
LINK AL CODICE SU GITHUB
ESECUZIONE DEL CODICE DI ESEMPIO
- Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.
java -jar –enable-preview CorsoJava.jar
- Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.
Scrivi un commento