2009-02-23 23 views
18

私はjavaキーワードthisが実際に何をしているのか理解しようとしています。 私はSunのドキュメントを読んできましたが、まだthisが実際に何をしているのか不明です。javaでキーワード "this"を使用

+1

@JasonCの質問は、このサイトの他の質問と重複している可能性があります。 –

答えて

36

キーワードは、現在のオブジェクトへの参照で詳述します。

class Foo 
{ 
    private int bar; 

    public Foo(int bar) 
    { 
     // the "this" keyword allows you to specify that 
     // you mean "this type" and reference the members 
     // of this type - in this instance it is allowing 
     // you to disambiguate between the private member 
     // "bar" and the parameter "bar" passed into the 
     // constructor 
     this.bar = bar; 
    } 
} 

それについて考えるための別の方法はthisキーワードは、あなたが自分自身を参照するために使用人称代名詞のようなものであるということです。他の言語は、同じ概念に対して異なる言葉を持っています。 VBはMeとPythonの規則を使用します(Pythonはキーワードを使用しないため、各メソッドに暗黙のパラメータを指定するだけです)。selfを使用します。

あなたは本質的にあなたのオブジェクトを参照した場合、あなたは言うでしょう。このような何か:thisとしてだけの方法のための

マイ腕や

考えます"私"と言うタイプ。だから、擬似コード表現は、このようになります。

class Foo 
{ 
    private int bar; 

    public Foo(int bar) 
    { 
     my.bar = bar; 
    } 
} 
+1

ハンガリー表記のようなものを使って、 "this"を使わずに上記を行うことができます。 m_bar = bar。実際にこれが本当に重要なことを本当に説明していません。 –

+1

それはそれのような奇妙な構造を避けることができますか? – Magnar

+0

@ng:フィールドの名前を変更できないときはどうしますか?スーパークラスの保護されたフィールドの場合と同様に? –

6

"this"は現在のオブジェクトへの参照です。

参照はhere

this
4

この

public class Blah implements Foo { 

    public Foo getFoo() { 
     return this; 
    } 
} 

のアンさらに良く使用それはあなたが現在のコンテキストで特に「この」オブジェクトすることができます。別の例:

public class Blah { 

    public void process(Foo foo) { 
     foo.setBar(this); 
    } 
} 

他にどのようにこれらの操作を実行できましたか。

+0

最初の例は、オブジェクトから 'this'を返すのは本当に意味がありません。呼び出し元はすでにオブジェクトへの参照を持っていますが、メソッドを呼び出す方法はほかにありませんか? – eljenso

+0

@eljenso:「これを返す」;メソッド内の唯一の行であり、そうです、それはかなり無駄です。しかし、それが例えばsetterを使用すると、メソッド連鎖を実行できます。myFoo.setBar(myBar).setBaz(myBaz).setMyInt(1); –

+0

それだけでなく、これを返すのがインタフェース実装の特徴ですか?私はあなたに、ある時点でこれを返す必要のない単一の複雑なプロジェクトを見せてくれるよう挑戦します。ほとんどのOOシステムの重要な要件です。 –

5

The keyword this is a reference to the current object。最高の次のコードで説明しています:あなたはthisキーワードを使用することを告げるあなたの場所で、コードの標準を持っていない限り、それは多くを使用していない

public class MyClass { 

    public void testingThis() 
    { 
     // You can access the stuff below by 
     // using this (although this is not mandatory) 

     System.out.println(this.myInt); 
     System.out.println(this.myStringMethod()); 

     // Will print out: 
     // 100 
     // Hello World 
    } 

    int myInt = 100; 
    string myStringMethod() 
    { 
     return "Hello World"; 
    } 

} 

。そこに1回の一般的な使用であり、あなたが同じパラメータ名を持つコードの規則に従うならば、あなたのクラスは、属性として、それはです:

public class ProperExample { 
    private int numberOfExamples; 

    public ProperExample(int numberOfExamples) 
    { 
     this.numberOfExamples = numberOfExamples; 
    } 
} 

をこのキーワードのひとつ適切な使用は、チェーンのコンストラクタにある(作りますコンストラクタ全体で一貫したオブジェクトを構築する):

public class Square { 
    public Square() 
    { 
     this(0, 0); 
    } 

    public Square(int x_and_y) 
    { 
     this(x_and_y, x_and_y); 
    } 

    public Square(int x, int y) 
    { 
     // finally do something with x and y 
    } 
} 

このキーワードは、たとえばC#。

+0

このコードは正しくありません。静的メソッドにはこれに関する参照はありません。 –

+0

コンパイルしますか?静的メソッドからオブジェクト要素にアクセスすることはできません。 – chburd

+0

いいえ、そうではありません。 main()は静的メソッドであるため、呼び出すオブジェクトがないため 'this'ポインタはありません。これはコンパイルしないでください。 – James

1

キーワード「この」は、現在のオブジェクトのコンテキストを参照しています。多くの場合(Andrewが指摘しているように)、明示的なを使用して、現在のオブジェクトを参照していることを明確にします。'this and super' からも

、:

*このため、他の用途があります。場合によっては、インスタンスメソッドを記述するときに、メソッドを含むオブジェクトを実際のパラメータとしてサブルーチンに渡す必要があります。その場合、これを実際のパラメータとして使用できます。たとえば、オブジェクトの文字列表現を出力する場合は、 "System.out.println(this);"と言うことができます。あるいは、この値を代入文の別の変数に代入することもできます。

は実際には、あなたがその値を変更する以外、他の変数で行うことができますこれで何かを行うことができます。*

そのサイトにもなるかもしれない「スーパー」の関連する概念を指し、これらが継承でどのように機能するかを理解するのに役立ちます。

0

英語で考えると、「このオブジェクト」はあなたが現在持っているオブジェクトです。

WindowMaker foo = new WindowMaker(this); 

はたとえば、JFrameのから拡張するクラスの内部で、現在であり、あなたはそれをJFrameのと対話できるように、JFrameのためにWindowMakerのオブジェクトへの参照を渡したいです。 "this"というオブジェクトに参照を渡すことで、JFrameへの参照を渡すことができます。

21

キーワードthisは、さまざまな状況で異なることを意味する可能性があります。これはおそらく混乱の原因です。

これは、現在の方法を上で呼び出されたインスタンスを参照するオブジェクトの参照として使用することができる。return this;

、現在のコンストラクタが作成される場合、例えば指すオブジェクトリファレンスとして使用することができます隠しフィールドにアクセスする:

MyClass(String name) 
{ 
    this.name = name; 
} 

には、コンストラクタ内からAAクラスの別のコンストラクタを呼び出すために使用することができる:ネストされたクラス内から封入インスタンスにアクセスするために使用することができる

MyClass() 
{ 
    this("default name"); 
} 

public class MyClass 
{ 
    String name; 

    public class MyClass 
    { 
     String name; 

     public String getOuterName() 
     { 
      return MyClass.this.name; 
     } 
    } 
} 
+0

# "this"はコンストラクタを介してのみ使用され、書かれていますか? 2#何について 'this.setTittle(" Fram of Tittle ")';あなたが見ることができるようにメソッドを呼び出すために使用されますが、私はその意味を理解していませんでしたか? – user2019510

+0

@ user2019510:いいえ、コンストラクタでのみ使用されるわけではありません。私の答えは、さまざまな用途の例を含んでいます。そして、それはメソッドを呼び出すために使用されます。その場合は現在のオブジェクトを意味し、他のオブジェクト参照を使用してメソッドを呼び出すのと同じように動作します。 –

+0

親切なお手伝いをお願いします@Michael :) – user2019510

1

これは、同じクラスのメソッド内のクラスの実際のインスタンスの参照です。 CALCで

public class A{ 
    int attr=10; 

    public int calc(){ 
    return this.getA()+10; 
    } 
    /** 
    *get and set 
    **/  

}//end class A 

コーディング()本体は、ソフトウェアは、現在割り当てられたオブジェクト内のメソッドを実行します。

オブジェクトの動作が自分自身に見える可能性はありますか? このというキーワードでは、

本当に、メモリ領域内のメソッドを呼び出すところJVMが知っているのでこのキーワードはありません(スーパーなど)義務を使用する必要がありますが、私の意見では、これは、コードをよりreadeableします。

1

これは、現在のコンテキストに関する情報にアクセスする方法でもあります。例えば :

public class OuterClass 
{ 
    public static void main(String[] args) 
    { 
    OuterClass oc = new OuterClass(); 
    } 

    OuterClass() 
    { 
    InnerClass ic = new InnerClass(this); 
    } 

    class InnerClass 
    { 
    InnerClass(OuterClass oc) 
    { 
     System.out.println("Enclosing class: " + oc + "/" + oc.getClass()); 
     System.out.println("This class: " + this + "/" + this.getClass()); 
     System.out.println("Parent of this class: " + this.getClass().getEnclosingClass()); 
     System.out.println("Other way to parent: " + OuterClass.this); 
    } 
    } 
} 
2

「は、この」キーワードは、メソッドが実行中である起因した現在のオブジェクトを指します。インスタンス変数とローカル変数が同じ名前を持つたびに、メソッドとインスタンス変数の引数として渡されるローカル変数間のあいまいさを避けるためにも使用されます。

例::

public class ThisDemo1 
{ 
    public static void main(String[] args) 
    { 
     A a1=new A(4,5);  
    } 
} 

class A 
{ 
    int num1; 
    int num2; 

    A(int num1) 
    { 
     this.num1=num1; //here "this" refers to instance variable num1. 
     //"this" avoids ambigutiy between local variable "num1" & instance variable "num1" 

     System.out.println("num1 :: "+(this.num1)); 
    } 

    A(int num, int num2) 
    { 
     this(num); //here "this" calls 1 argument constructor within the same class. 
     this.num2=num2; 
     System.out.println("num2 :: "+(this.num2)); 
     //Above line prints value of the instance variable num2. 
    } 
} 
0

すべてのオブジェクトが、この(時々この 参照呼ばれる)キーワードを使用して自分自身への参照をアクセスすることができます。

まず、上記の方法のgetNameでコード

public class Employee { 

private int empId; 
private String name; 

public int getEmpId() { 
    return this.empId; 
} 

public String getName() { 
    return this.name; 
} 

public void setEmpId(int empId) { 
    this.empId = empId; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

に見てみましょう()インスタンス変数名を返します。 は今

public class Employee { 

private int empId; 
private String name; 

public int getEmpId() { 
    return this.empId; 
} 

public String getName() { 

    String name="Yasir Shabbir"; 
    return name; 
} 

public void setEmpId(int empId) { 
    this.empId = empId; 
} 

public void setName(String name) { 
    this.name = name; 
} 


public static void main(String []args){ 
    Employee e=new Employee(); 
    e.setName("Programmer of UOS"); 

    System.out.println(e.getName()); 

} 

}

出力 ヤシルShabbir

  • このオペレータは、常にインスタンス変数(オブジェクトに属する) ない任意のクラスでは動作しているようなコードの別の見てみましょう変数(クラスに属しています)
  • これは常にクラス以外の静的属性を参照しません。その他のパラメータまたはローカル変数。これは、常に非静的メソッドで使用
  • このオペレータは静的変数で作業することはできません
  • (クラス変数)

**注:**この方法は、パラメータまたはローカル変数を含む論理エラーが頻繁にありますこれはクラスのフィールドと同じ名前の です。この場合、クラスの フィールドにアクセスする場合はthisを使用します。それ以外の場合は、メソッドパラメータまたはローカル変数が参照されます。

0

これは非常に簡単です。現在の オブジェクトの参照を保持します。

  • このキーワードは、このキーワードは、静的関数または静的ブロック内で使用することができない
  • 現在のクラスのインスタンスの参照を保持するこのキーワードは、インスタンスの影変数にアクセスするために使用することができる
  • このキーワードを使用すると、現在のオブジェクトを関数呼び出しのパラメータとして渡すことができます。
  • このキーワードは、コンストラクタチェーンの作成に使用できます

出典:http://javaandme.com/core-java/this-word

関連する問題