LE CLASSI IN JAVA
DEFINIZIONE
Una classe è la definizione di un tipo di oggetto. Una classe specifica il nome e il tipo delle variabili di istanza degli oggetti, ma non specifica il loro valore. Una classe specifica i metodi dei suoi oggetti. Un oggetto di una classe è una istanza della classe. Partiamo con un esempio che consiste nel definire una classe ContoCorrente. Come vedi in figura tale classe ha una variabile saldo (attributo) che, come vedremo più avanti, è di tipo private e tre metodi pubblici. Nella parte più a destra puoi vedere tre istanze di tale classe conto1, conto2 e conto3 e i rispettivi saldi. Tutto sarà più chiaro più avanti nell’articolo.
Una classe è un modello per una serie di oggetti che sono poi istanze di questa classe. In essa sono definiti attributi (variabili) e metodi che rappresentano le azioni compiute sugli oggetti. Un attributo rappresenta una proprietà di una classe. Esso descrive un insieme di valori che la proprietà può avere quando vengono istanziati oggetti di quella determinata classe. Una classe può avere zero o più attributi. Alcuni membri sono relativi alle istanze della classe e di questi ogni istanza ne riceverà una dotazione specifica e individuale, e altri invece che sono relativi alla classe stessa, cioè sono membri di classe. Una classe si crea con la parola chiave class seguita da un nome che prevede la notazione Camel-Case (ogni inizio di parola in maiuscolo). La definizione della classe è poi racchiusa in un body (corpo di codice delimitato da parentesi graffe).
GLI ATTRIBUTI
All’interno di una classe possiamo inserire degli attributi che sono dichiarazioni di variabili. Gli attributi che non vengono inizializzati ricevono comunque dei valori di default.
Dopo la definizione degli attributi una classe può definire un insieme di metodi.
Ogni metodo ha un nome, come accade per gli attributi, esso a differenza degli attributi rappresenta un’azione, inoltre ogni metodo prevede un certo numero di parametri in ingresso, una serie di informazioni che dovranno essere fornite al metodo ogni volta che viene invocato. Può anche non ricevere parametri, in ogni caso è richiesta una coppia di parentesi tonde dopo il nome. Infine, ogni metodo deve indicare un tipo di ritorno nell’esempio void significa che non ritorna nulla, double ritorna un double.
MEMBRI STATICI
In una classe possono essere presenti membri che non sono pensati per le singole istanze bensì per la classe stessa. Hanno uno scopo differente rispetto ai membri di istanza. Riprendiamo l’esempio tralasciando i membri di istanza.
Il modificatore static rende di fatto l’attributo conti una variabile di classe, pure i metodi inc() e dec() essendo preceduti dalla keyword static sono metodi o membri di classe. Ogni singolo oggetto quando viene creato riceve in dotazione tutti i membri di istanza. Questi attributi sono specifici di ciascuna istanza. La classe stessa mantiene invece una sola copia degli attributi statici.
MEMBRI PUBBLICI E PRIVATI
Torniamo ad osservare lo schema generale della classe conto corrente. Sulla base del principio di information hiding, occorre mantenere una parte di attributi e metodi privati, cioè non esposti all’esterno della classe in cui sono definiti. È tuttavia opportuno esporre una parte dei membri della classe per andare a formare quella che viene definita interfaccia pubblica. Nell’esempio riportato si vede che abbiamo omesso i modificatori di accesso.
I modificatori di accesso applicati a livello di attributi e metodi ci permettono di impostare la visibilità pubblica o privata di un attributo o metodo. Il modificatore private specificato per l’attributo saldo indica che il membro è privato e utilizzabile solo all’interno della classe. Nessun altro metodo al di fuori della classe conto corrente sarà in grado di leggere o modificare il suo valore.
Il modificatore public viceversa è utilizzabile sia all’interno della classe sia in classi diverse. Così facendo abbiamo definito l’interfaccia pubblica della classe Conto Corrente. Se omettiamo i modificatori di accesso i valori di default sono simili a public, ma con una limitazione, sono visibili solo all’interno del proprio package.
ISTANZIARE UNA CLASSE
Iniziamo a parlare della seconda categoria dei Data Type i reference type dato che tutte le classi sono gestite come tipi riferimento. Si dichiara un oggetto della classe avente il medesimo nome della classe come se fosse una normale variabile. Per creare fisicamente l’oggetto utilizziamo l’operatore new, che serve ad allocare la memoria per l’oggetto che stiamo istanziando. Possiamo anche condensare in un’unica istruzione la dichiarazione e l’istanziazione di un oggetto.
ContoCorrente cc = new ContoCorrente();
Oppure farlo separatamente:
ContoCorrente cc; (dichiarazione)
cc = new ContoCorrente(); (istanziazione)
Dopo questa istruzione la variabile oggetto cc è una istanza della classe ContoCorrente.
Abbiamo definito e creato un nuovo oggetto della classe Conto Corrente e lo abbiamo assegnato alla variabile cc.
VALORI E RIFERIMENTI
Iniziamo con la definizione (dichiarazione e inizializzazione) di un tipo primitivo, un intero. Quello che succede è che viene riservata un area di memoria che è adatta a contenere un numero intero, (4 Byte) e all’interno della memoria viene rappresentato in forma binaria il numero 10. Se assegniamo ad una seconda variabile y il valore di x Java predispone una ulteriore area di memoria sempre di 4 Byte che contiene l’intero y; Le due aree di memoria sono completamente distinte, infatti viene fatta una copia del valore della variabile x nell’area di memoria occupata da y.
In altre parole, il valore della memoria che è associata alla variabile x viene copiato, duplicato nell’area di memoria associata alla variabile y. Se adesso andiamo a modificare il valore che abbiamo assegnato a x la variabile y continua a mantenere il suo valore proprio perché viene fatta una copia.
REFERENCE TYPE
Vediamo ora cosa succede con gli oggetti, che sono dei reference type. Per effetto dell’operatore new viene allocata dinamicamente un’area di memoria sufficiente a contenere tutti gli attributi di istanza della classe Conto Corrente e i suoi metodi. Questa area di memoria non viene direttamente associata a cc come accadeva per i tipi primitivi, in realtà cc punta a un area di memoria che contiene l’indirizzo in cui risiedono i dati. Per essere più precisi la variabile cc contiene un riferimento all’oggetto vero e proprio che in realtà si trova altrove, in una differente area di memoria.
Abbiamo due variabili cc e cc2 ognuna della quale contiene un riferimento a un certo oggetto. Assegniamo alla variabile cc la variabile cc2. C’è un solo oggetto che possiede due riferimenti, qualsiasi modifica agli attributi di istanza apportata tramite la variabile cc si ripercuote su cc2 in pratica viene fatta una copia del riferimento. Per l’oggetto che rimane privo di riferimento entra in azione il Garbage Collector che vedremo successivamente.
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