5

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

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

スタック-メソッドが呼び出されたとき

ただし、コンストラクターの場合、オブジェクトが作成されているため、この参照は引数リストとともに保存されません。スタック-コンストラクターが呼び出されたとき

私の質問は、コンストラクターにこの参照がない場合、コンストラクター内でそれをどのように使用できるかということです。

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

2 に答える 2

1

thisは、現在のオブジェクトを参照できる Java キーワードです。どのクラスでも使用できます。

キーワードを使用する目的はthis、ローカル変数の参照を防ぐことです。

i = iどちらも同じローカル変数(クラス変数ではない)への参照であるため、まったく何もしないため、例では必要です。

ここから

インスタンス メソッドまたはコンストラクター内では、これは現在のオブジェクト (メソッドまたはコンストラクターが呼び出されているオブジェクト) への参照です。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);

次のようなものに翻訳される可能性があります:(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);

しかし、これはすべてはるかに低いレベルにあるため、実際にはこのようには見えませんが、それについて考えるための方法にすぎない可能性があります.

于 2013-03-16T16:14:57.043 に答える
0

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

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
    }
}
于 2013-03-16T16:15:44.810 に答える