これはそれ自体への暗黙的なポインタです。簡単に言うと、どのオブジェクトが this が配置されているメソッドを呼び出すかということになります。
サンプルコード: TestThis_1.java
次のようにコードをコピーします。
/* 質問: これは何ですか
* 出力結果:
* A@4e44ac6a
*/
パブリック クラス TestThis_1 {
public static void main(String[] args) {
A aa = 新しい A();
System.out.println(aa.f()); //aa.f()、オブジェクト aa の参照 (ポインタ) を返します。
}
}
クラスA {
パブリック A f() {
return this; // f() メソッドを呼び出すオブジェクトのクラス A オブジェクトへの参照を返します。
}
}
これの一般的な使用法
1. 同じ名前の変数を区別する
サンプルコード: TestThis_2.java
次のようにコードをコピーします。
/* この一般的な使用法 1: 同じ名前の変数を区別する
* 出力結果:
* これは i = 1
* i = 33
*/
パブリック クラス TestThis_2 {
public static void main(String[] args) {
A aa = 新しい A(33);
}
}
クラスA {
public int i = 1 //この i はメンバー変数です。
/*注意: 一般的にこのようには書かれません。コンストラクターは主に初期化用であり、このように書くのは主に理解を容易にするためです*/
public A(int i) { //この i はローカル変数です
System.out.printf("this. i = %d/n", this.i); //this.i はオブジェクト自体のメンバー変数 i を参照します。
System.out.printf("i = %d/n", i); //i はローカル変数 i です。
}
}
2. コンストラクター間の相互呼び出し
サンプルコード: TestThis_3.java
次のようにコードをコピーします。
/* この 2 の一般的な使用法: コンストラクター内で相互に呼び出します */
パブリック クラス TestThis_3 {
public static void main(String[] args) {
}
}
クラスA {
int i、j、k;
パブリック A(int i) {
this.i = i;
}
public A(int i, int j) {
/* i = 3; error コメントアウトされていない場合、エラーが報告されます: this(...) でコンストラクターを呼び出す場合、最初の文にのみ配置できます。
* TestThis_3.java:20: エラー: これへの呼び出しはコンストラクターの最初のステートメントである必要があります
* これ(i);
* ^
※1 エラー
*/
これ(i);
this.j = j;
}
public A(int i, int j, int k) {
this(i, j);
this.k = k;
}
}
注意事項
static によって変更されたメソッドには、このポインターがありません。 static によって変更されたメソッドはパブリックであるため、それがどの特定のオブジェクトに属しているかはわかりません。
サンプルコード: TestThis_4.java
次のようにコードをコピーします。
/*静的メソッド内には this ポインタはありません*/
パブリック クラス TestThis_4 {
public static void main(String[] args) {
}
}
クラスA {
静的 A f() {
これを返します。
/* エラー メッセージ: TestThis_4.java:10: エラー: 非静的変数です。これは静的コンテキストから参照できません
* これを返します;
* ^
※1 エラー
*/
}
}