Menu

Classi in Java: definire campi, metodi e oggetti

Cos'è una classe in Java, come definire campi e metodi, creare oggetti con new, il ruolo di this e perché lo stato di istanza vive nell'oggetto.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una classe è un progetto

Finora il tuo codice è vissuto in metodi che si passano valori semplici. Una classe ti permette di raggruppare dati correlati e il comportamento che opera su di essi in un unico tipo con un nome. La classe è il progetto; le cose concrete con cui lavori sono gli oggetti creati a partire da essa.

Una classe dichiara due tipi di membri: i campi (i dati che ogni oggetto contiene) e i metodi (ciò che ogni oggetto sa fare).

new Dog() costruisce un oggetto in memoria e ti restituisce un riferimento a esso. d.name e d.bark() agiscono proprio su quell'oggetto.

Ogni oggetto ha il proprio stato

Il senso di una classe è che puoi produrre molti oggetti indipendenti, ognuno con i propri valori dei campi. Cambiarne uno non tocca mai gli altri.

rex e bella sono due oggetti distinti. Ognuno ha il proprio name, quindi ogni bark() stampa un valore diverso. Questi dati propri di ciascun oggetto si chiamano stato di istanza.

Campi e metodi lavorano insieme

I metodi di una classe possono leggere e aggiornare direttamente i campi del proprio oggetto, senza bisogno di riceverli come parametri. Il metodo "vive" già sull'oggetto di cui tocca i dati.

Nota che increment() non riceve argomenti. Lavora sul campo del Counter su cui lo hai chiamato. È questa la differenza tra un metodo di classe e un metodo static isolato: il metodo ha un oggetto implicito su cui agire.

La parola chiave this

Dentro un metodo, this è un riferimento all'oggetto su cui il metodo è stato chiamato. Di solito non ti serve: scrivere count significa già this.count. Ma this diventa indispensabile quando il nome di un parametro coincide con quello di un campo, cosa che succede di continuo nei setter e nei costruttori.

Un errore tipico dei principianti è scrivere x = x; dentro move. Così assegni il parametro a se stesso e il campo resta invariato: il compilatore non ti avvisa e l'oggetto mantiene in silenzio i vecchi valori. È this.x = x; che aggiorna davvero il campo.

Valori predefiniti dei campi e riferimenti null

Quando crei un oggetto, i suoi campi non contengono dati casuali: Java li inizializza con valori predefiniti, cioè 0 per i numeri, false per boolean e null per i riferimenti a oggetti come String. Quel null predefinito è l'origine di un crash classico.

u.name è null perché nessuno lo ha impostato, quindi chiamare .length() su di esso lancia una NullPointerException. Assegna sempre valori sensati a un oggetto prima di usarne i campi: è proprio il problema che risolvono i costruttori.

Organizzare il codice attorno alle classi

I programmi reali modellano il proprio dominio con classi che tengono insieme i dati e le operazioni su di essi. Qui una sola classe BankAccount conserva un saldo e controlla come cambia:

I dati (balance) e le regole per modificarli (deposit, withdraw) stanno in un unico punto. Il codice altrove chiede al conto di fare qualcosa invece di mettere mano direttamente ai suoi numeri: è la base di un design pulito e facile da mantenere.

Prossimo passo: i costruttori

Impostare a mano ogni campo dopo new è noioso e facile da dimenticare, e come hai appena visto un campo dimenticato lascia un null pronto a far crashare il programma. Un costruttore ti permette di richiedere e inizializzare i campi di un oggetto nel momento stesso in cui viene creato, così un BankAccount non può mai esistere senza un titolare. È l'argomento della prossima pagina.

Domande frequenti

Cos'è una classe in Java?

Una classe è un progetto che definisce i dati (campi) e il comportamento (metodi) che avrà un certo tipo di oggetto. La classe in sé è solo il modello: gli oggetti veri li crei a partire da essa con new. Per esempio, una classe Dog descrive che ogni cane ha un name e può fare bark(), mentre ogni new Dog() è un cane distinto con il proprio nome.

Qual è la differenza tra una classe e un oggetto in Java?

Una classe è la definizione; un oggetto è un'istanza concreta costruita da quella definizione con new. Una sola classe Person può produrre molti oggetti Person, ognuno con i propri valori dei campi. Pensa alla classe come a uno stampo per biscotti e agli oggetti come ai singoli biscotti: cambiare i campi di un oggetto non tocca mai quelli di un altro.

Cosa fa la parola chiave this in una classe Java?

this si riferisce all'oggetto corrente, cioè l'istanza specifica di cui è in esecuzione il metodo. La usi per raggiungere i campi dell'oggetto stesso, soprattutto quando un parametro ha lo stesso nome di un campo (this.name = name;). Senza this, l'assegnazione darebbe al parametro il suo stesso valore e il campo resterebbe invariato.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA