Originariamente inviato da LiLyblack
codice:
public Rubrica (String nome) {
this.nomeRub = nome;
voci = new Persona[10];
}
Nella soluzione dell’ esercizio si ha
codice:
public Rubrica (String nome) {
nomeRub = nome;
voci = new Persona[10];
}
Ho notato che anche la mia soluzione funziona, non genera errori di compilazioni e il risultato è corretto.
Gli errori di compilazione vengono lanciati in caso di errori sintattici o chiamate a metodi inesistenti, ad esempio.
Ma quali differenze ci sono nell’utilizzo di this?
this, come dice la parola stessa, si riferisce a "questo" oggetto. E' una parola chiave che ti permette di riferirti all'oggetto stesso.
Il tuo utilizzo non è scorretto perchè this in quel caso fa riferimento all'oggetto Rubrica (visto che lo stai usando in Rubrica... se crei una classe Persona ed al suo interno usi this, starai utilizzando l'oggetto corrente di tipo Persona), e nomeRub è una variabile di Rubrica.
this utilizzato in quel modo è solo ridondante... Viene invece utilizzato per "nascondere" la variabile di istanza. Se il tuo parametro "nome" lo chiami "nomeRub" (o viceversa), e non utilizzi la parola chiave this, se farai "nomeRub = nomeRub" assegnerai alla variabile temporanea (il parametro del costruttore)... la variabile temporanea! Questo perchè hanno lo stesso nome.
Se tu applichi il this a nomeRub, stai dicendo a Java di fare riferimento alla variabile nomeRub di Rubrica, e quindi "this.nomeRub = nomeRub" assegnerà alla variabile di istanza il parametro del costruttore.
I due modi, anche per altri metodi , non solo per il costruttore, sono equivalenti? Da che ounto di vista? Quale dei due è più corretto?
Come avrai quindi capito non sono equivalenti, o meglio, nel tuo caso lo sono perchè è ovvio tu ti stia riferendo alla variabile di istanza! Quindi che tu metta o meno il this, ti riferisci alla variabile di istanza.
Il this ha ovviamente lo stesso utilizzo anche nei metodi. Ad esempio nei metodi setter.
codice:
private String value;
// ............
void setValue(String value) {
this.value = value;
}
Senza il this, proprio come prima, stai assegnando al parametro "value", il parametro "value".
Un esempio, giusto per essere più chiari:
codice:
class Esempio1 {
private int x,y;
Esempio1(int x,int y) {
x = x;
this.y = y;
// Questo e' solo per mostrarti gli effetti di this
System.out.println("Costruttore (stampa dopo assegnazione):\nx: "+x);
System.out.println("this.x: "+this.x);
System.out.println("\ny: "+y);
System.out.println("this.y: "+this.y);
}
int getX() {
return x;
}
int getY() {
return y;
}
}
class Esempio {
public static void main(String[] args) {
Esempio1 e1 = new Esempio1(10,20);
System.out.println("\n\nStampa valori richiamando i metodi.");
System.out.println("x: "+e1.getX());
System.out.println("y: "+e1.getY());
}
}
La classe Esempio si limita a creare l'oggetto e passare 2 valori (x,y) al costruttore di Esempio1.
Esempio1 ha 2 variabili, chiamate x, ed y; il costruttore riceve 2 parametri, chiamati anche loro x ed y.
Nel caso di x non viene utilizzata la parola chiave this, nel caso di y invece si.
Come noti, la stampa all'interno del costruttore non lascia dubbi:
codice:
Costruttore (stampa dopo assegnazione):
x: 10
this.x: 0
y: 20
this.y: 20
Stampa valori richiamando i metodi.
x: 0
y: 20
La variabile x di Esempio1 non ha subito alcuna assegnazione, al contrario di y (su cui, ricordo ancora una volta, abbiamo utilizzato this e quindi abbiamo detto di voler assegnare un valore alla y di Esempio1).
Spero di essere stato chiaro non ostante l'ora in cui ho scritto. ^^