English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、Javaのthisキーワードについて、どのように、どこで使用されるかを例を通じて説明します。
Javaでは、thisキーワードは、メソッドやコンストラクタ内の現在のオブジェクトを参照するために使用されます。例えば、
class Main { int instVar; Main(int instVar){ this.instVar = instVar; System.out.println("this参照= "); + this); } public static void main(String[] args) { Main obj = new Main(8); System.out.println("オブジェクト参照= "); + obj); } }
出力:
this参照 = com.ThisAndThat.MyClass@74a14482 オブジェクト参照 = com.ThisAndThat.MyClass@74a14482
上の例では、Mainクラスのobjという名前のオブジェクトを作成しました。その後、クラスのオブジェクトobjとthisキーワードの参照を印刷しました。
ここでは、objとthisの参照が同じであることがわかります。これは、これは単に現在のオブジェクトの参照であることを意味します。
様々な状況で、通常thisキーワードを使用します。
Javaでは、範囲(クラス範囲またはメソッド範囲)内で2つ以上の同じ名前の変数を宣言することは許可されていません。しかし、インスタンス変数と引数が同じ名前を持つことができます。例えば、
class MyClass { // インスタンス変数 int age; // 引数 MyClass(int age){ age = age; } }
上のプログラムでは、インスタンス変数と引数が同じ名前を持っています:age。ここでは、名前が不明確であるため、Javaコンパイラが困惑しています。
この場合、thisキーワードを使用します。例えば、
まず、thisキーワードを使用しない例を見てみましょう:
class Main { int age; Main(int age){ age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = ", + obj.age); } }
出力:
mc.age = 0
上の例では、値8コンストラクタに渡されました。しかし、私たちが得た0は出力です。これは、Javaコンパイラがインスタンス変数と引数の間の名前が不明確であるため混乱しているためです。
今、thisキーワードを使用して上記のコードを書き直してみましょう。
class Main { int age; Main(int age){ this.age = age; } public static void main(String[] args) { Main obj = new Main(8); System.out.println("obj.age = ", + obj.age); } }
出力:
obj.age = 8
今や期待される出力が得られました。これは、構造関数が呼び出されたとき、構造関数内の内容が呼び出した構造関数のオブジェクトobjで置き換わるためです。したがって、age変数は以下のように割り当てられます8。
また、パラメータとインスタンス変数の名前が異なる場合、コンパイラは自動的にthisキーワードを付加します。例:
class Main { int age; Main(int i) { age = i; } }
等価です:
class Main { int age; Main(int i) { this.age = i; } }
thisキーワードの別の一般的な使用法は、クラスのsetterとgetterメソッドの例として:
class Main { String name; // setterメソッド void setName(String name) { this.name = name; } // getterメソッド String getName(){ return this.name; } public static void main( String[] args ) { Main obj = new Main(); // setterとgetterメソッドを呼び出す obj.setName("Seagull"); System.out.println("obj.name: ",+obj.getName()); } }
出力:
obj.name: Seagull
ここでは、thisキーワードを使用しています:
setterメソッドで値を割り当て
getterメソッドで値にアクセス
処理中構造関数オーバーロード時他の構造関数から構造関数を呼び出す必要がある場合、明示的に構造関数を呼び出すことはできません。その代わりに、thisキーワードを使用する必要があります。
ここでは、thisキーワードの別の形式を使用しています。つまりthis()です。例を挙げてみましょう
class Complex { private int a, b; //带两个参数的構造関数 private Complex(int i, int j) { this.a = i; this.b = j; } //単一のパラメータを持つコンストラクタ private Complex(int i){ //二つのパラメータでコンストラクタを呼び出します this(i, i); } //パラメータなしのコンストラクタ private Complex(){ //単一のパラメータでコンストラクタを呼び出します this(0); } @Override public String toString(){ return this.a + " + " + this.b + "i"; } public static void main( String[] args ) { //Complexクラスのオブジェクトを作成します //使用2パラメータでコンストラクタを呼び出します Complex c1 = new Complex(2, 3); //単一のパラメータでコンストラクタを呼び出します Complex c2 = new Complex(3); //パラメータなしでコンストラクタを呼び出します Complex c3 = new Complex(); //オブジェクトを印刷します System.out.println(c1); System.out.println(c2); System.out.println(c3); } }
出力:
2 + 3i 3 + 3i 0 + 0i
上記の例では、thisキーワードを使用しています。
Complex(int i)コンストラクタからComplex(int i, int j)コンストラクタを呼び出します
Complex()コンストラクタからComplex(int i)コンストラクタを呼び出します
この行に注意してください。
System.out.println(c1);
ここでは、オブジェクトcを印刷する際に、1オブジェクトが文字列に変換される際、toString()が呼び出されます。このプロセスで、toString()メソッドをオーバーライドしていますので、そのメソッドから出力を得ます。
this()の最大の利点の1つは、重複コードの数を減らすことです。しかし、this()を使用する際には特に注意を払う必要があります。
これは、別のコンストラクタからコンストラクタを呼び出すことでコストが増加し、遅いプロセスになるためです。this()を使用するもう一つの大きな利点は、重複コードの数を減らすことです。
注意:別のコンストラクタからコンストラクタを呼び出すことを明示的なコンストラクタ呼び出しと呼びます。
thisキーワードを使用して、現在のオブジェクトをメソッドに引数として渡すことができます。例えば、
class ThisExample { // 変数を宣言します int x; int y; ThisExample(int x, int y) { //コンストラクタ内の変数に値を設定します this.x = x; this.y = y; //add()を呼び出す前のxとyの値 System.out.println("thisをaddTwo()メソッドに渡す前に:"); System.out.println("x = ") + this.x + ", y = " + this.y); //add()メソッドを呼び出し、thisを引数として渡します add(this); //add()を呼び出した後のxとyの値 System.out.println("thisをaddTwo()メソッドに渡した後:"); System.out.println("x = ") + this.x + ", y = " + this.y); } void add(ThisExample o){ o.x += 2; o.y += 2; } } class Main { public static void main( String[] args ) { ThisExample obj = new ThisExample(1, -2); } }
出力:
addTwo() メソッドに this を渡す前に: x = 1, y = -2 addTwo() メソッドに this を渡した後: x = 3, y = 0
上記の例では、ThisExample() コンストラクタ内で以下の行に注意してください:
add(this);
ここでは、this を引数として渡して add() メソッドを呼び出します。this キーワードはクラスのオブジェクト obj の参照を含んでいるため、add() メソッド内で x と y の値を変更することができます。