2013-03-16 18 views
5

私はプログラミング方法論(スタンフォード)(CS106A)を参照しています Javaのコース。 lecture 14教授サハミは、関数とスタックとヒープ上のオブジェクトのJavaでのメモリ割り当てについて語った。コンストラクタ内部のこの参照

彼は、オブジェクト上で呼び出されたどのメソッドでも、スタックが割り当てられ、引数リストとこの参照はstackeにスペースが割り当てられていると言っています。 これは、が保存されているため、Javaはオブジェクトの正しいインスタンス変数を参照することができます。

stack--when method is called

が、コンストラクタのオブジェクトが が構築されているように何この参照は、引数リストと一緒に格納されていません。コンストラクタは、我々は元

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

答えて

1

thisのコンストラクタ内でそれを使用することができますどのようにこのreferneceを持っていない場合はstack -- when constructor is called

私QUESです単にあなたが現在のオブジェクトを参照することを可能にするJavaキーワードです。どのクラスでも使用できます。

キーワードthisを使用する目的は、ローカル変数を参照しないようにすることです。

両方が同じローカル変数(ないクラス変数)への参照であるためi = iは、絶対に何もしませんので、それは、あなたの例で必要とされる:インスタンスメソッド内

From hereまたはコンストラクタで、これは現在のオブジェクト(メソッドまたはコンストラクタが呼び出されているオブジェクト)への参照です。インスタンスメソッドまたはコンストラクタ内から、現在のオブジェクトの任意のメンバを参照することができます。

EDIT:

私はあなたが実際のメモリアドレスについて尋ねてきたことを実感。それは実際に見ないように、

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); 

(明示的thisを作る)が、これはすべての非常に低いレベルに次のようになります。

は私が

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); 

のようなものに変換される可能性があります想像しますこのような遠隔操作は可能ですが、それについて考えることができます。

+0

あなたは正確なことを知っていますか?ところで、それはそれを持ってくれてありがとう.... –

+0

@ T.J。いいえ、私はちょうど基本的なアイデア、何が起こるか分かりません。 – Dukeling

0

これはすべて、現在のオブジェクトのクラスレベル変数を参照しています。
キーワードが使用されていない場合、変数はメソッドレベル変数に格納されます。

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 
    } 
} 
関連する問題