PDA

View Full Version : [Java] Reference "this"


soeca
07-12-2008, 11:59
ragazzi ho un problemino! sto imparando(piano piano)a programmare in java e non capisco una cosa: come si usa il reference this?ho letto che serve per referenziare ogni variabile d'istanza che non è esplicitamente referenziata!!e se ci sono più variabili d'istanza non referenziate?come si applica il this????grazie a tutti!!!!:D

wizard1993
07-12-2008, 12:45
this è passato implicitamente ad ogni funzione ed è un riferimento all'oggetto stesso, serve per accedere alle variabili ed ai metodi tramite il riferimento oggetto.metodo, al di la dei fatti stilistici (c'è a chi piace a chi no) il riferimento this è utile in queste situazioni
class prova{
int x,y;
public prova(int x,int y){
this.x=x;
this.y=y;
}
}


in questo caso se non si usasse this, il compilatore riconoscerebbe l'istruzione come autoassegnamento poichè lo scope della variabile passata come paramentro è maggiore di quello delle variabili membro

soeca
07-12-2008, 12:55
aspetta fammi capire bene!!!allora abbiamo questo codice:
class prova{
int x,y;
public prova(int x,int y){
this.x=x;
this.y=y;
}
}
la parte this.x vuol dire che il this si sta riferendo alla variabile d'istanza(int x,y) o al parametro formale del metodo?

Oceans11
07-12-2008, 12:59
this.x si riferisce alla variabile d'istanza "corrente", x è il parametro formale

soeca
07-12-2008, 13:09
ah ok....quindi in questo caso si assegna alla variabile d'istanza il valore del parametro formale!!!mentre se non fosse stato messo il this ci sarebbe stato un autoassegnamento come ha detto wizard1993 perchè

x = x
^ ^
| |
| |
(qui si sta riferendo al (qui assegna il valore
parametro formale) del parametro formale)

e quindi x=x sarebbe inutile scriverlo perchè assegnerebbe un valore a se stesso!!giusto??

soeca
07-12-2008, 13:13
ragazzi lasciate stare il disegno......avevo provato a disegnare una freccia sotto la prima x e dire che li si riferiva al parametro formale!stessa cosa ho fatto con la seconda x a destra dell'uguale e avevo scritto che li assegnava il valore del parametro formale!!!ma il testo non viene formattato come avrei voluto!!!:cry: sorry!!

Oceans11
07-12-2008, 16:29
class prova{
int x,y;
public prova(int x,int y){
this.x=x;
this.y=y;
}
}


in questo caso se non si usasse this, il compilatore riconoscerebbe l'istruzione come autoassegnamento poichè lo scope della variabile passata come paramentro è maggiore di quello delle variabili membro

Non sono d'accordo, semmai succede il contrario. L'istruzione riconosciuta dal compilatore è senza ombra di dubbio di autoassegnamento, ma lo scope della variabile d'istanza è in questo caso più ampio del parametro esplicito.

Infatti codice del tipo:
public class prova{
int x,y;

public prova(int x,int y){
x=x;
y=y;
}

public static void main(String[] args) {
prova p = new prova(4, 5);
System.out.println("p.x=" + p.x);
System.out.println("p.y=" + p.y);
}
}

produce quest'output:
p.x=0
p.y=0
e non p.x=4
p.y=5

malocchio
07-12-2008, 17:00
Non sono d'accordo, semmai succede il contrario. L'istruzione riconosciuta dal compilatore è senza ombra di dubbio di autoassegnamento, ma lo scope della variabile d'istanza è in questo caso più ampio del parametro esplicito.

Infatti codice del tipo:
public class prova{
int x,y;

public prova(int x,int y){
x=x;
y=y;
}

public static void main(String[] args) {
prova p = new prova(4, 5);
System.out.println("p.x=" + p.x);
System.out.println("p.y=" + p.y);
}
}

produce quest'output:
e non

Su "Sun Certified Java Programmer" di Sierra e Bates sta scritto che. riguardo all'uso del this, i parametri formali "nascondono" le variabili d'istanza.

Inoltre, x=x, secondo quello che dici tu, sarebbe uguale a this.x = this.x
Sarebbe generato un errore perché usi una variabile (d'istanza) non ancora inizializzata, indipendentemente dal fatto che sia un'autoassegnamento.

Oceans11
07-12-2008, 17:15
Su "Sun Certified Java Programmer" di Sierra e Bates sta scritto che. riguardo all'uso del this, i parametri formali "nascondono" le variabili d'istanza.

Non lo conosco, ma facendo un pò come San Tommaso e provando con le mie mani, ho ottenuto quell'output, non mi sembra che ci siano dubbi.

Inoltre, x=x, secondo quello che dici tu, sarebbe uguale a this.x = this.x
Sarebbe generato un errore perché usi una variabile (d'istanza) non ancora inizializzata, indipendentemente dal fatto che sia un'autoassegnamento.

Sì infatti! x=x in realtà viene letto this.x = this.x.
E non è vero che la variabile d'istanza non è ancora inizializzata, perchè dove non lo è esplicitamente, il compilatore la inizializza a valori di default (0 per numeri, false per i boolean e null per gli oggetti).

malocchio
07-12-2008, 17:55
Non lo conosco, ma facendo un pò come San Tommaso e provando con le mie mani, ho ottenuto quell'output, non mi sembra che ci siano dubbi.



Sì infatti! x=x in realtà viene letto this.x = this.x.
E non è vero che la variabile d'istanza non è ancora inizializzata, perchè dove non lo è esplicitamente, il compilatore la inizializza a valori di default (0 per numeri, false per i boolean e null per gli oggetti).

Abbiamo ragione metà per uno!

Se io al posto di fare autoassegnamenti scrivo nel costruttore
x = 2;
y = 3;
l'output è sempre uguale.

class Prova {
public int x;
public int y;
public Prova (int x, int y) {
x = 2;
y = 4;
}
public static void main(String[] args) {
Prova p = new Prova(2,8);
System.out.println("p.x = "+p.x);
System.out.println("p.y = "+p.y);
System.exit(0);
}
}

L'output è:
p.x = 0
p.y = 0


Significa che nel costruttore le due variabili x e y nascondono quelle d'istanza, quindi non è vero che "x = x" è equivalente a "this.x = this.x" !!!

Però le variabili d'istanza vengono inizializzate dal compilatore a zero di default (non lo sapevo, io inizializzo sempre tutto nel costruttore).

Le variabili d'istanza non vengono neanche toccate nel costruttore.

Questo
Sarebbe generato un errore perché usi una variabile (d'istanza) non ancora inizializzata, indipendentemente dal fatto che sia un'autoassegnamento.
non è vero perché le var d'istanza sono inizializzate nel momento dell'allocazione della memoria, e quindi se nel costruttore faccio System.out.print(this.x), questo stampa 0. Mea culpa

Oceans11
07-12-2008, 18:22
Abbiamo ragione metà per uno!

Se io al posto di fare autoassegnamenti scrivo nel costruttore
x = 2;
y = 3;
l'output è sempre uguale.

class Prova {
public int x;
public int y;
public Prova (int x, int y) {
x = 2;
y = 4;
}
public static void main(String[] args) {
Prova p = new Prova(2,8);
System.out.println("p.x = "+p.x);
System.out.println("p.y = "+p.y);
System.exit(0);
}
}

L'output è:
p.x = 0
p.y = 0


Significa che nel costruttore le due variabili x e y nascondono quelle d'istanza, quindi non è vero che "x = x" è equivalente a "this.x = this.x"!!!

azz! beh ho ricontrollato e hai ragione tu stavolta, 50:50! :D
Pure mea culpa! Speriamo di non aver confuso troppo le idee a chi chiedeva chiarimenti! :stordita: