LE CLASSI IN JAVA
VARIABILI E SCOPE
Come già sappiamo, guardando l’immagine sotto riportata, x è un attributo di istanza della classe MyClass. In questa sezione parleremo di variabili e scope intendendo con scope l’ambito di visibilità delle variabili.
x guardando la figura più in alto, è il primo tipo di variabili che possiamo andare a definire. E’ una sorta di variabile globale (visibile in tutta la classe). Questo attributo è visibile all’interno del corpo di codice o body che rappresenta la classe. Lo scope per utilizzare una definizione più appropriata è rappresentato dal blocco di codice della classe. Adesso inseriamo un metodo di istanza che effettua la differenza tra due variabili passate in input come parametri. Lo scope in questo caso delle variabili a e b (parametri passati al metodo) è il blocco di codice del metodo di istanza sott. Al di fuori del metodo queste due variabili non sono visibili. Questo è il secondo tipo di scope che possiamo definire in Java. a e b sono variabili locali.
Adesso introduciamo una nuova variabile k. Le variabili che introduciamo all’interno di un metodo sono anch’esse locali. Questa variabile è visibile sia nel blocco di codice in cui è stata dichiarata che in eventuali sotto blocchi nidificati, lo scope parte dal punto in cui viene definita, non prima.
Proviamo a definire una variabile con lo stesso nome k nel blocco nidificato. Non possiamo definire in un blocco nidificato una variabile avente lo stesso nome di una variabile definita all’esterno del blocco, questo perché la variabile k più esterna è ancora in scope, cioè non è uscita dal suo ambito di visibilità.
Proviamo ora a cambiare il nome della variabile k in x, x è la variabile di istanza avente come scope l’intera classe. In gergo si dice che stiamo nascondendo la variabile di istanza; infatti, nel metodo di istanza, x rappresenta la variabile locale e non quella di istanza. In realtà la possiamo usare la variabile di istanza con un meccanismo che ora vedremo.
LA KEYWORD THIS
All’interno di un metodo ci consente di riferirci all’istanza che stiamo utilizzando. this fa riferimento all’oggetto corrente. Ogni volta che viene invocato un metodo, oltre ai normali argomenti dietro le, quindi, viene passato un ulteriore argomento che si chiama this. this è un riferimento implicito sull’istanza su cui stiamo invocando il metodo, tradotto significa questo e sta per “Questa istanza”. Vediamo un esempio.
Quello che possiamo fare con la parola chiave this è questo. Possiamo usarla come un normale riferimento all’istanza della classe sulla quale stiamo invocando il metodo setAttr.
Vediamo un caso di utilizzo. A volte è necessario chiamare i parametri come gli attributi di istanza, in quanto molto spesso gli attributi vengono valorizzati attraverso i parametri di un metodo come ad esempio setAttr. Ma abbiamo un problema che la figura evidenzia. x e y all’interno del metodo si riferiscono ai due parametri, gli attributi di istanza sono stati nascosti dalle variabili locali.
Adesso andiamo a riscrivere il codice come riportato in figura. Adesso i conti tornano perché con this.x e this.y ci stiamo riferendo agli attributi di istanza, correttamente valorizzati dai parametri x e y. Anche in viewAttr() possiamo usare this.x e this.y per riferirci agli attributi di istanza.
PARAMETRI E ARGOMENTI
I parametri sono i valori che i metodi possono chiedere in ingresso quando vengono invocati. Riprendiamo in esame la classe ContoCorrente e inseriamo un nuovo metodo. Un giroconto è un trasferimento di denaro da un conto ad un altro, nella figura si vede che prima viene effettuato un prelievo dal conto, poi sull’istanza del ContoCorrente passato in input viene fatto un accredito pari al valore del secondo parametro importo.
Abbiamo visto che la definizione di un metodo può prevedere l’utilizzo di parametri, al momento dell’invocazione di un metodo i valori passati in ingresso sono chiamati argomenti. Nel momento in cui definiamo un metodo possiamo includere una definizione di parametri, quando viene invocato i valori passati vengono chiamati argomenti. Questa è la differenza tra parametri e argomenti.
PASSARE UN OGGETTO A UN METODO
Riprendiamo il codice precedente e cerchiamo di capire quale è la differenza di quando passiamo come argomento a un metodo un reference type rispetto a un tipo primitivo.
valore ha già una propria memoria associata e contiene l’importo 500.00.
Il valore 500.00 viene passato al metodo. Il passaggio del tipo primitivo è stato eseguito per valore by-value, il valore dell’argomento è stato duplicato e passato al parametro. Queste due variabili sono completamente scollegate fra loro.
Se modifichiamo l’importo localmente la variabile valore mantiene il suo value.
Nei tipi reference le cose cambiano. L’argomento che viene passato al metodo è una istanza della classe ContoCorrente. Sappiamo che in un tipo reference cc2 contiene un riferimento (indirizzo) all’area di memoria in cui si trova l’oggetto.
Il passaggio di cc2 al parametro avviene come i tipi primitivi per copia, con una differenza molto importante, il valore che viene duplicato e passato By-Value non è l’oggetto ContoCorrente ma il suo riferimento. L’invocazione del metodo deposito avviene su una copia del riferimento, cioè sullo stesso oggetto puntato da cc2.
Nel momento in cui l’esecuzione del metodo giroconto termina e la variabile dest esce di scope, il valore del saldo rimane correttamente a 3000.00.
RITORNARE UN OGGETTO DA UN METODO
Adesso impareremo cosa succede quando un oggetto viene ritornato da un metodo. Introduciamo la classe. Ogni volta che invochiamo il metodo statico create otteniamo come valore di ritorno dal metodo una istanza della classe MyClass.
Vediamo cosa visualizza il metodo view().
mc esce di scope alla fine del metodo tuttavia l’oggetto creato sopravvive in quanto viene assegnato ad un altro riferimento nella variabile che lo acquisisce come valore di ritorno (mc1).
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