2013-03-16 12 views
5

Sto guardando Programming Methodology (Stanford) (CS106A) corso su Java. In lecture 14 Professor Sahami ha parlato dell'allocazione della memoria in Java per funzioni e oggetti su stack e heap.questo riferimento all'interno del construstor

Ha detto che per qualsiasi metodo chiamato su un oggetto, viene assegnato uno stack e l'elenco degli argomenti e questo riferimento viene assegnato spazio su stack. Attraverso memorizzato questo riferimento, Java è in grado di fare riferimento alle variabili di istanza corrette di un oggetto.

stack--when method is called

ma per costruttore no questo riferimento viene memorizzato insieme con la lista argomento come oggetto viene costruiti. stack -- when constructor is called

miei ques è se il costruttore non hanno hanno questo refernece allora come possiamo utilizzarlo all'interno di costruzione per ex

public class foo { 
private int i; 
public foo(int i) 
{this.i = i;// where this reference came from} 
       } 

risposta

1

this è semplicemente una parola chiave Java che permette di fare riferimento all'oggetto corrente. Può essere utilizzato in qualsiasi classe.

Lo scopo dell'utilizzo della parola chiave this è impedire il riferimento a una variabile locale.

È necessaria nel tuo esempio, dal momento che i = i farà assolutamente nulla, dal momento che entrambi sono riferimenti alla stessa variabile locale (non la variabile di classe):

From here:

Entro un metodo di istanza o un costruttore, questo è un riferimento all'oggetto corrente - l'oggetto di cui viene chiamato il metodo o il costruttore. È possibile fare riferimento a qualsiasi membro dell'oggetto corrente all'interno di un metodo di istanza o di un costruttore utilizzando questo.

EDIT:

mi rendo conto che potrebbe essere stato chiedendo circa l'indirizzo di memoria effettiva.

immagino

class Point 
{ 
    int x, y; 
    Point(int x, int y) { this.x = x; this.y = y; } 
    void move(int a, int b) { x = a; y = b; } 
} 
Point p = new Point(3,4); 
p.move(1,2); 

potrebbe ottenere tradotto in qualcosa di simile a: (facendo esplicito this)

class Point 
{ 
    int x, y; 
    static Point getPoint(int x, int y) 
    { Point this = allocateMemory(Point); this.x = x; this.y = y; } 
    static void move(Point this, int a, int b) { this.x = a; this.y = b; } 
} 
Point p = Point.getPoint(3,4); 
Point.move(p, 1, 2); 

ma questo sarebbe tutto su un livello molto più basso, in modo che non sarebbe in realtà guardare da remoto, ma potrebbe essere solo un modo per pensarci.

+0

sai esattamente cosa ??? a proposito grazie lo ha ottenuto .... –

+0

@ T.J. No, non so esattamente cosa succede, solo l'idea di base. – Dukeling

0

tutto ciò fa riferimento alla variabile di livello di classe dell'oggetto corrente.
Se la parola chiave this non viene utilizzata, la variabile verrà archiviata nella variabile di livello del metodo.

public class foo { 
    private int i; 

    public foo(int i) { 
     this.i = i; // stores the argument i into the class level variable i 
    } 

    public foo2(int i) { 
     i = i; // stores the argument i into the argument i 
    } 
}