web-dev-qa-db-ja.com

javaでキーワードthisを使用する

Javaキーワードthisが実際に何をするかを理解しようとしています。Sunのドキュメントを読んでいますが、まだthisは実際にあります。

19
BloodParrot

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

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

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

本質的に自分のものであるオブジェクトを参照する場合は、次のようにします。

My腕またはmy

thisは、タイプが「my」を言うための単なる方法と考えてください。したがって、擬似コード表現は次のようになります。

class Foo
{
    private int bar;

    public Foo(int bar)
    {
        my.bar = bar;
    }
}
38
Andrew Hare

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

現在のメソッドが呼び出されたインスタンスを参照するオブジェクト参照として使用できます:return this;

現在のコンストラクターが作成しているインスタンスを参照するオブジェクト参照として使用できます。非表示フィールドにアクセスするには:

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

コンストラクター内からクラスの別のコンストラクターを呼び出すために使用できます。

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

ネストされたクラス内から囲んでいるインスタンスにアクセスするために使用できます。

public class MyClass
{
    String name;

    public class MyClass
    {
        String name;

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

「これ」は、現在のオブジェクトへの参照です。

詳細を見る こちら

6
Otávio Décio

キーワード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";
    }

}

thisキーワードを使用するように指示されているコード標準がない限り、これはあまり使用されません。これには一般的な使用法が1つあります。それは、クラスの属性と同じパラメーター名があるコード規則に従っている場合です。

public class ProperExample {
    private int numberOfExamples;

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

Thisキーワードの適切な使用法の1つは、コンストラクターをチェーンすることです(コンストラクター全体で構成オブジェクトを一貫させる)。

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#。

5
Spoike

これのさらに良い使い方

public class Blah implements Foo {

   public Foo getFoo() {
      return this;
   }
}

これにより、現在のコンテキストで具体的に「this」オブジェクトを使用できます。もう一つの例:

public class Blah {

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

他にどのようにこれらの操作を行うことができますか。

4
ng.

「this」キーワードは、メソッドが実行中であるために現在のオブジェクトを参照します。また、インスタンス変数とローカル変数の名前が同じ場合は、メソッドで引数として渡されるローカル変数とインスタンス変数のあいまいさを回避するためにも使用されます。

例::

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.
    }
}

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

また、「 this and super 」から:

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

実際、値を変更することを除いて、これを使用して他の変数で実行できることは何でも実行できます。*

このサイトは、関連する「super」の概念も参照しています。これは、これらが継承でどのように機能するかを理解するのに役立つ場合があります。

1
Joe Liversedge

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

public class A{
    int attr=10;

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

}//end class A

calc()本体では、現在割り当てられているオブジェクト内でメソッドが実行されます。

オブジェクトの振る舞いがどのように見えるのか。 thisキーワードを使用します。

本当に、thisキーワードには、必須の使用は必要ありません(-super)JVMはメモリ領域のどこでメソッドを呼び出すかを知っているためですが、私の意見では、これによりコードが読みやすくなります。

1
alepuzio

また、現在のコンテキストの情報にアクセスする方法にもなります。例えば:

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);
    }
  }
}
1
PhiLho

「これ」が行うことは非常に単純です。現在のオブジェクトの参照を保持します。

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

ソース: http://javaandme.com/core-Java/this-Word

0
Ajay

すべてのオブジェクトは、キーワードthisでそれ自体への参照にアクセスできます(this参照と呼ばれることもあります)。

まずコードを見てみましょう

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

}

上記のメソッドでは、getName()はインスタンス変数名を返します。次に、同様のコードをもう一度見てみましょう。

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

}

}

出力 Yasir Shabbir

  • この演算子は常にインスタンス変数(オブジェクトに属する)で機能し、クラス変数(クラスに属する)ではありません
  • これは常に、他のパラメータやローカル変数ではなく、クラスの非静的属性を参照します。
  • これは常に非静的メソッドで使用します
  • この演算子は静的変数(クラス変数)では機能しません

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

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

WindowMaker foo = new WindowMaker(this);

たとえば、現在JFrameから拡張されたクラス内にいて、JFrameと対話できるように、JFrameのWindowMakerオブジェクトへの参照を渡したいとします。 「this」と呼ばれるオブジェクトへの参照を渡すことにより、JFrameへの参照を渡すことができます。

0
Kyle G