LE CLASSI IN JAVA

IL COSTRUTTORE

java-logo

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.

MyClass

Istanziamo la classe senza utilizzare il metodo create, e senza inizializzare gli attributi di istanza.

Istanze di MyClass

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.

Costruttore

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.

Error

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.

Create

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.

Metodi forma generale

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.

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.

Overload dei metodi

Definiamo un metodo main(). Il compilatore è in grado di richiamare il metodo giusto in base alla lista dei parametri forniti.

main

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.

Overload dei metodi

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.

Classe di Test

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.

Conto Corrente

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.

Costruttore classe Conto Corrente

Creiamo l’istanza cc2.

Istanza

Adesso abbiamo perso il costruttore di default, cioè non possiamo più scrivere:

ContoCorrente cc = new ContoCorrente();

Possiamo evitare ciò utilizzando l’overload dei costruttori.

Overload del costruttore

INVOCARE COSTRUTTORI OVERLOADED

Riprendiamo in esame la classe ContoCorrente. In pratica poniamo il focus sui due costruttori che abbiamo definito.

Costruttori

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.

this

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.

Inner Class

Non è vero il contrario, cioè una classe esterna non ha accesso ai membri (attributi e metodi) della classe interna.

Istanza inner class

Creiamo una classe di test per provare il programma.

Test Inner class

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.

inner class in un method

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.

static block

Questo codice viene eseguito una volta sola, tipicamente quando la classe viene portata in memoria perché ne creiamo una istanza.

istanze con blocco statico

LINK AI POST PRECEDENTI

IL LINGUAGGIO JAVA

LINK AL CODICE SU GITHUB

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.