DOMANDA [JAVA] Dubbio nell’uso di this

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ricorda questo: l'oggetto è un'istanza di una classe.
La classe è quella che scrivi, che è il tuo contenitore composto da membri (variabili e metodi). Quando crei un oggetto viene allocata la memoria e ti viene restituito un riferimento a quell'oggetto in memoria. Questo è quello che usi quando fai "d.getNome()", ad esempio.

this è l'istanza corrente della classe. La usi solo in quella classe perché è appunto un riferimento all'istanza corrente.

Di fatto l'oggetto è la classe in memoria.

Si, lo scope del this è la classe, ma è l'istanza corrente della classe (l'oggetto).

Ps. a fine pausa pranzo dovrei riuscire a farti qualche esempio e integrare quanto intendo
 

Andretti60

Utente Èlite
6,440
5,091
Quando descrivi una classe, definisci solo come il compilatore interpretera' gli oggetti che in seguito dichiarerai come istanze di quella classe. Quindi nel codice della classe non c'e' nessun riferimento a oggetti ben specifici, per esempio quando definisci un campo come private int mCode; niente viene allocato in memoria, significa semplicemente che un intero chiamato mCode potra' essere chiamato all'interno dello scope in cui e' definito, ma solo DOPO che un oggetto e' stato costruito. La classe non e' nulla, solo la definizione di come funzioneranno gli oggetti di tale classe (OK, non e' del tutto vero, esistono classi 'globali' che sono immediatamente allocate in memoria e NON possono essere costruite, ma lasciamo perdere i dettagli che poi dipendono dal linguaggio)
Facciamo un esempio:
Java:
Class Disco
{
    private double mRaggio;
    public Disco(double raggio)
    {
        mRaggio=raggio;
    }
    public double GetArea()
    {
        return mRaggio * mRaggio * 3.14;
    }
}
Abbastanza banale. Guarda il codice del metodo GetArea: al suo interno usa la variabile mRaggio, che e' un membro priovato della classe inizializzato nel costruttore. A cosa si riferisce mRaggio in tale metodo? Ricorda, questa e' solo una definizione. Al momento non esiste nessun oggetto di tipo Disco, la variabile mRaggio non esiste, non e' allocata. E' solo quando ne creiamo una che il codice ha senso, in quanto mRaggio rappresenta una variabile allocata nella memoria dell'oggetto appena creato:
Java:
Disco d = new Disco(3);
double area = d.GetArea();
In altre parole, quando il codice gira, nel metodo GetArea() viene usato come mRaggio la locazione in memoria relativa all'oggetto in questione (in questo caso 'd'). Questo viene anche rappresentato all'interno della classe come this.mRaggio; anche se in questo caso non ce ne e' bisogno in quanto non esiste ambiguita'.

Piu' in generale, anche i tipi di dati intrinsichi non allocano nulla. Il tipo 'int' definisce solo come gli oggetti di tale tipo vengono manipolati, ma per se' non alloca nessuna memoria. 'int' non "rappresenta" una variabile. E' solo quando definisci una variabile di quel tipo che hai in effetti un "oggetto" di quel tipo (o quella classe, infatti in alcuni linguaggi di programmazione TUTTO e' definito come una classe). Ricorda, il codice che scrivi per definire una classe va bene per TUTTI gli oggetti di quella classe. Scrivendo 'this' implicitamente dice "sto parlando dell'oggetto su cui sto lavorando adesso".

Tutto questo sembra un inutile sofismo o esercizio in teorica, ma e' in effetti alla base della programmazione (per ogni linguaggio OOP). Se si capisce quello, tutto poi diventa piu' facile. Per esempio si capira' poi cosa significhi parlare di classe, membri e metodi di tipo static.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!