LE CLASSI IN JAVA
IL COSTRUTTORE
Un costruttore è un metodo particolare che serve a fabbricare istanze della propria classe. Questo metodo ha lo stesso nome della classe che vogliamo istanziare, ritorniamo all’esempio precedente.
Istanziamo la classe senza utilizzare il metodo create, e senza inizializzare gli attributi di istanza.
Come vedi gli attributi di istanza sono valorizzati ai valori di default, che per i tipi numerici sono degli zeri. Introduciamo il costruttore. Una particolarità del costruttore è quella di non avere un tipo di ritorno, inoltre solitamente ha dei parametri che servono ad inizializzare gli attributi della propria classe.
Per brevità ho omesso il codice del metodo view() che rimane lo stesso. Se adesso compiliamo la classe otteniamo un errore perché il metodo create usa un costruttore vuoto che non è stato dichiarato.
Java dietro le quinte utilizza un costruttore di default vuoto, che utilizza tutte le volte che non lo definiamo noi. Tuttavia, se il costruttore lo abbiamo definito Java rimuove questo costruttore di default e si produce un errore di compilazione. Possiamo evitare l’errore modificando il codice in questo modo.
OVERLOAD DEI METODI E POLIMORFISMO
Abbiamo la possibilità di definire diverse forme per lo stesso metodo che differiscono fra loro per via dei parametri ricevuti. Con il termine Polimorfismo di cui l’overload dei metodi è un primo esempio, intendiamo “Avere molte forme”. Ritorniamo alla forma generale di definizione di un metodo.
Il nome e la lista dei parametri costituiscono la signature di un metodo, all’interno di una classe possiamo implementare metodi che hanno lo stesso nome ma signature differente. Questo tipo di definizione viene chiamato overload dei metodi.
Fai attenzione a una cosa. La signature di un metodo si riferisce al nome e alla lista dei parametri e non al tipo restituito. Facciamo un esempio.
Definiamo un metodo main(). Il compilatore è in grado di richiamare il metodo giusto in base alla lista dei parametri forniti.
OVERLOAD DEI METODI E CONVERSIONE
Andiamo a vedere come si comporta l’overload dei metodi in presenza di una conversione implicita dei tipi primitivi. Torniamo a guardare una versione semplificata di MyClass.
La prima invocazione non necessita di conversione, nella seconda chiamata lo short viene promosso ad intero, nella terza chiamata a myMethod non vi è conversione, viene richiamato il metodo in overload che accetta un double. Nell’ultima viene richiamato sempre questo metodo e il float è promosso a double. Le conversioni che hai visto vengono eseguite quando non c’è una corrispondenza tra l’argomento e il parametro.
OVERLOAD DEI COSTRUTTORI
Così come possiamo eseguire l’overload dei metodi allo stesso modo è possibile eseguire l’overload dei costruttori. Riprendiamo in esame la classe ContoCorrente in cui non abbiamo usato i costruttori.
Con il costruttore possiamo inizializzare il saldo e crearne l’istanza. Nelle versioni di codice precedenti abbiamo sempre usato il costruttore di default, quello creato da Java senza parametri.
Creiamo l’istanza cc2.
Adesso abbiamo perso il costruttore di default, cioè non possiamo più scrivere:
ContoCorrente cc = new ContoCorrente();
Possiamo evitare ciò utilizzando l’overload dei costruttori.
INVOCARE COSTRUTTORI OVERLOADED
Riprendiamo in esame la classe ContoCorrente. In pratica poniamo il focus sui due costruttori che abbiamo definito.
Utilizzando la parola chiave this possiamo invocare i vari costruttori all’interno di essi. Il costruttore senza parametri invoca il costruttore che accetta un parametro double. Queste operazioni hanno un certo costo in termini di performance, quindi non bisogna abusarne.
INNER CLASS
Una inner class è una classe definita all’interno di un’altra classe, è una classe locale rispetto alla classe più esterna. Ritorniamo alla classe MyClass. All’interno di una inner class abbiamo accesso diretto ai membri della classe esterna, ma non viceversa.
Non è vero il contrario, cioè una classe esterna non ha accesso ai membri (attributi e metodi) della classe interna.
Creiamo una classe di test per provare il programma.
Possiamo andare oltre, possiamo definire una inner class in un metodo della classe esterna. Il programma di test non cambia, quello che è cambiato è lo scope della inner class visibile solo in myMethod. Vediamo il codice.
IL BLOCCO STATIC
I costruttori come abbiamo visto sono molto utili, tuttavia ci sono circostanze in cui non sono lo strumento che ci serve, ad esempio potremmo voler eseguire del codice una volta sola quando la classe viene caricata a Runtime, oppure eseguire delle operazioni di inizializzazione su attributi statici prima di utilizzare su questi attributi metodi statici. Riprendiamo il codice di MyClass.
Questo codice viene eseguito una volta sola, tipicamente quando la classe viene portata in memoria perché ne creiamo una istanza.
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