1

Java での「this」の使い方がよくわかりません。誰かが私を明確にするのを手伝ってくれたら、本当に感謝しています。

この Web サイトには次のように書かれています: http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

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

そして、次の例を示します。

たとえば、 Point クラスは次のように記述されていました

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int a, int b) {
        x = a;
        y = b;
    }
}

しかし、次のように書くこともできます:

public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

しかし、なぜ x = a が this.x = x のように書けるのか、まだ完全には理解できません。this.x = a ではないのはなぜですか? ×が左側にあるのはなぜですか?

申し訳ありませんが、私はJavaが初めてです。専門家を退屈させて申し訳ありません。

4

9 に答える 9

3

オブジェクトのプロパティと同じ名前の変数/引数が定義されている場合、そのプロパティの名前と「重複」するため、this.var_name を使用する必要があります。

そうです、 と書くこともできますがthis.x = a、やや冗長です。

于 2012-04-15T22:55:41.997 に答える
2

2 番目の例では、引数の 1 つに x という名前が付けられています。this.x を参照すると、メソッドが含まれるクラスの x フィールド/プロパティを意味します。次のように読むことができます: Point.x = 引数 x

これは、2 つを区別するために使用され、コードの意味を明確にします。

于 2012-04-15T22:56:09.043 に答える
1

thisは現在のオブジェクトへの参照であるため、他のオブジェクトと同じようにアクセスできます -this.xは のxプロパティですthisxに代入する、渡される引数も同様ですthis.x

これがネームスペースです。変数の名前は、特定のコード ブロック内でのみ適用されるという考え方です。クラスに属する関数内で作業しているJavaでは、そのクラスの名前空間内にいますが、引数として同じ名前の別の変数がある場合、それが優先され、代わりに属性にアクセスします経由this

this他の方法でも使用できます。たとえば、現在のオブジェクトを架空のライブラリの画面に描画したい場合、クラス内から次のようにします。

window.draw(this)

関数を呼び出すこともできます

this現在「内部」にあるオブジェクトを参照できるため、現在のオブジェクトを引数として渡すことができます。これは非常に便利です。(しゃれは意図されていません)。

于 2012-04-15T22:59:51.480 に答える
1

2 番目の例には「a」がないため、this.x = a ではありません。ポイントは、同じ変数名を再利用できることです。これにより、混乱が少なくなります:-|

于 2012-04-15T22:56:20.680 に答える
1

「this」は、現在使用しているオブジェクトへの参照です。フィールドとパラメーターの間で名前が競合する場合に使用します。パラメータはフィールドよりも優先されます。

衝突はありません。これは必要ありません。

public Point(int a, int b) {
    x = a;
    y = b;
}

しかし、これも機能します:

public Point(int a, int b) {
    this.x = a;
    this.y = b;
}

名前が衝突します。"this" を使用する必要があります:

public Point(int x, int y) {
    this.x = x;
    this.y = y;
}

あなただけの場合

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

次に、パラメーターに独自の値を割り当てるだけで、事実上何もしません。

キーワード「this」の使用法は他にもあります。

于 2012-04-15T22:58:26.210 に答える
1

アイデアは、コンストラクターに値を提供していることを非常に明確にすることです。xy

問題は、コンストラクター内でxフィールドではなく、渡された値を参照するスコープ規則が原因であるということxです。したがってx = x、パラメーターには独自の値が割り当てられ、シャドウ フィールドは変更されません。これは通常、必要なものではありません。

したがって、「ここですぐに表示される xとは別のxが必要です」と言うメカニズムが必要です。Herethisは現在のオブジェクトをthis.x参照します。したがって、現在のオブジェクトのフィールドをsuper参照し、このオブジェクトが拡張するオブジェクトを参照するため、「より高い」フィールドに到達できます。

于 2012-04-15T22:58:48.327 に答える
0

「これ」は、オブジェクトを操作するメソッドがどのオブジェクトを操作するかを正確に知るために渡される隠された「引数」です。

ここで、「x」という名前の引数を渡しますが、クラスにはその var 名が既に定義されているとします。何が起こるのですか ?オブジェクトに「属する」名前 x と引数 x は同じデータ オブジェクトではありませんが、名前は共有しています。

曖昧さをなくすために、明示的に「this.x」と言う必要があります。これは、既に「this」オブジェクトに属している x について話していることをコンパイラーに伝えます。(つまり、操作しようとしている現在のオブジェクトです。)

于 2012-04-15T22:59:50.393 に答える
0

2 番目の例では、コンストラクターへの引数は not aandbです。xそれらはおよびに変更され、 「この Point クラス インスタンスのメンバー変数に、コンストラクターに渡された値を代入する」ことyを意味します。this.x = x;xx

于 2012-04-15T23:00:36.490 に答える
0

これは、Java コンパイラが変数を名前で識別する方法に実際に関係しています。関数 (仮) パラメーター名は、クラス メンバー変数の前に付けます。最初の例では、正式なパラメーター名は a と b であり、メンバー変数 x および y と衝突しないため、次のように記述します。

x = a;

x はメンバー変数クラス Point のみを意味するため、論理的です。

2 番目の例では、x は仮パラメーター名とメンバー変数の両方を参照しています。関数本体内に x を記述するとパラメーターが参照されるため、メンバー変数 x を参照するために他の方法が必要な場合。これは、「this」キーワードを介してメンバーに明示的にアクセスすることによって行われます。

于 2012-04-15T23:02:13.627 に答える