2012-04-15 2 views
1

私はJavaで 'this'の使用を本当に理解していません。誰かが私を明確にするのを助けることができたら、私は本当にそれを感謝します。インスタンスメソッドまたはコンストラクタ内http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html誰かが私に「これ」の使用を詳しく説明できますか?

」、これは現在のオブジェクトへの参照です - そのメソッドまたはコンストラクタが呼び出されているオブジェクトあなたは、任意のメンバーを参照することができます。このウェブサイト上の

それが言います。これを使用してインスタンスメソッドまたはコンストラクタ内から現在のオブジェクトを取得します。

、それは次の例得られます、しかし

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

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

:たとえば

を、Pointクラスは、この

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

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

のように書かれていたが、それはこのように書かれている可能性が私はまだ、なぜx = aがthis.x = xと書かれているのか完全に理解していないのですか?それはなぜthis.x = aではないのですか?左のxはなぜですか?

私は申し訳ありませんが、私はJavaにとって非常に新しいです。私は専門家を退屈して謝罪します。

+0

2番目の例では、コンストラクタへのパラメータの名前は 'a'と' b'ではなく 'x'と' y'であるため、 'this.x = a'と言っても意味がありません。 aが存在する。あなたの最初の例では、 'this.x = a'と' this.y = b'は完全に受け入れられます。 'this'は、同じ名前の変数を区別する一般的な方法として使用されます.2番目の例のように、' x = x'と書いただけでは、コンパイラは 'x'がどれであったかを知ることができません。 –

答えて

3

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

したがって、それはthis.x = aと書くことができますが、やや冗長です。

+0

'this'リファレンスを使用する理由を指定することはできますか?前もって感謝します。 – BugShotGG

+0

私の前のコメントは無視されます。 :) – BugShotGG

2

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

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

1

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

+0

それは私が見逃していたものです。 :D – Outlier

1

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

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

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

しかし、これはあまりにも、動作します:

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

名前の衝突、 "これ" を使用する必要があります。

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

をあなただけの場合

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

パラメータを割り当てるだけで、効果的に何もしません。

キーワード「this」の使用が増えています。

+0

ありがとうございました。 – Outlier

1

コンセプトでxyの値を提供していることを、非常ににすることです。

この問題は、コンストラクタ内の有効範囲規則のため、xは、フィールドxではなく、渡された値を参照するようになりました。したがってx = xは、パラメータに独自の値が割り当てられ、影付きフィールドは変更されません。これは通常、求められるものではありません。

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

0

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

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

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

1

this現在のオブジェクトへの参照ですので、あなたは他のオブジェクトのようにアクセス - this.xthisxプロパティです。したがってxが渡された引数で、this.xに割り当てます。

これは名前空間です。変数の名前は、指定されたコードブロック内にのみ適用されます。クラスに属している関数内で作業しているjavaでは、そのクラスの名前空間の内側にありますが、引数と同じ名前の別の変数がある場合は優先され、その属性にアクセスしますthisによって

は、他の方法でも使用できます。たとえば、クラスの中から、私が行うことができ、私は架空のライブラリの画面に現在のオブジェクトを描きたいと言う:

window.draw(this) 

あなたは

thisは私たちが参照できるようにする機能をも呼び出すことができます私たちは現在 '内部'にあるので、現在のオブジェクトを引数として渡すことができます。これは非常に便利です。 (意図しない言い訳)。

0

第2の例では、コンストラクタの引数はabではありません。 xyに変更され、this.x = x;は「このPointクラスインスタンスのメンバ変数xにコンストラクタに渡された値をxとして割り当てる」という意味です。

0

これは実際に、Javaコンパイラがどのように名前で変数を識別するかと関係しています。関数(形式)パラメータ名は、クラスメンバ変数に先行します。最初の例では、正式なパラメータ名はaとbであり、彼らはメンバー変数xとyと衝突しそう

x = a; 

のみメンバ変数クラスPointを意味することができ、xと論理的である書き込みをしないでください。

第2の例では、xは仮パラメータ名とメンバ変数の両方を指します。関数本体の中にxを書くことは、メンバー変数xを参照するために他の方法が必要な場合には、そのパラメータを参照します。これは、 'this'キーワードを使用してメンバーに明示的にアクセスすることによって行われます。

関連する問題