thisキーワードの説明ページです。
thisはフィールドやメソッドに付加することができる、自分自身のインスタンス(オブジェクト)を指し示すキーワードです。
もくじ
thisの概要
thisは前述の通り、自分自身のインスタンス(オブジェクト)を指し示すものです。自クラスのメソッドやフィールドはthisが省略された形になっています。
また、thisはコンストラクタ内でも利用することができます。
様々なthisの記述と利用法
thisを変数名に付加する
ローカル変数とフィールドは同じ名前を利用できますが、メソッド内ではローカル変数が優先して利用されます。ローカル変数とフィールドを同名にした際、thisを付加することでフィールドとして明示することができます。
※thisはインスタンスを指すため、変数名に付加するとフィールドとなります。
フィールドにthisを追加 | this.フィールド名 |
---|---|
記述例 | void execute(int number){ 空白this.number = number ; } |
thisをメソッドと利用する
メソッドにthisを追加 | this.メソッド名(引数) |
---|---|
記述例 | this.execute() ; |
thisをコンストラクタ内で利用する
コンストラクタ内からオーバーロードされた他のコンストラクタを呼び出す際に利用できます。例えば、引数なしのコンストラクタ内で、引数ありのコンストラクタを呼び出したい場合が挙げられます。
但し、コンストラクタ内で他のコンストラクタを呼び出す場合は、必ず先頭に記述する必要があります。
コンストラクタをthisで呼び出し | this(引数) |
---|---|
記述例 | Test(){ 空白this(“ななし”,1) ; } Test(String s, int n){ 空白str = s; 空白number n; 空白System.out.println(“初期化しました”) ; } |
this サンプルプログラム
以下のプログラムを「ThisTest.java」「Number41.java」という名前でWorkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、Number41.javaをコンパイルしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
class ThisTest{ private int number ; private String name ; //引数なしのコンストラクタ public ThisTest(){ this("ななし",1); } //引数ありのコンストラクタ public ThisTest(String name, int number){ //ローカル変数からフィールドへ代入 this.name = name; this.number = number ; System.out.println("初期化しました。"); } //敬称を追加するメソッド private void add_honorifics(){ name += "様"; } //表示を行うメソッド public void print(){ //メソッド名にthisを付加 this.add_honorifics(); System.out.println("名前は" + name + "です。"); System.out.println("番号は" + number + "番です。"); } } |
1 2 3 4 5 6 |
class Number41{ public static void main(String[] args){ ThisTest tt = new ThisTest(); tt.print(); } } |
実行例
C:\work>javac Number41.java
C:\work>java Number41
初期化しました。
名前はななし様です。
番号は1番です。
※実行例はコンパイルおよび実行時の例を表示しています。
補足 thisを利用する際の注意点
thisは自分自身のインスタンスを指し示すものなので、staticメソッド内では利用できません。
※static無しのメンバ(インスタンス変数やインスタンスメソッド)はstatic内では利用できません。
例えば、main()メソッドはstatic付きですので、main()メソッド内で以下のようにthisを利用するとコンパイルエラーとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Number41{ //以下のフィールドを追加 private int a = 5; private static int b = 10; public static void main(String[] args){ ThisTest tt = new ThisTest(); tt.print(); //コンパイルエラーの例 System.out.println(this.a); System.out.println(this.b); } } |
実行例
C:\work>javac Number41.java
Number41.java:11: エラー: staticでない変数 thisをstaticコンテキストから参照することはできません
System.out.println(this.a);
^
Number41.java:12: エラー: staticでない変数 thisをstaticコンテキストから参照することはできません
System.out.println(this.b);
^
※bというフィールドはstaticで宣言されており、main()メソッド内で利用できますが、staticを付けてしまうとコンパイルエラーとなります。
this 復習問題
- thisの説明として正しいものを選んでください。
- 解答群
- thisを付加するとアクセス禁止となる
- thisを付加するとサブクラスを指し示す
- thisを付加しない場合はsuperが自動的に付加される
- thisは自分自身のオブジェクトを指し示す
- フィールド名を「this.フィールド名」とした変更した場合の説明として正しいものを選んでください。
- 解答群
- thisを付加するとアクセス禁止となる
- thisを付加するとローカル変数と同名の場合、ローカル変数の扱いとなる
- thisを付加するとローカル変数と同名の場合、フィールドの扱いとなる
- thisを付加するとstaticと同様の扱いになる
- this()という記述の説明として正しいものを選んでください。
- 解答群
- this()はメソッドを指し示し、メソッド内部で記述できる
- this()はコンストラクタを指し示し、コンストラクタ内部で記述できる
- this()は引数ありのコンストラクタを呼び出す
- this()はコンストラクタを指し示し、コンストラクタ内部であれば記述場所は問わない
- お疲れ様でした。
まとめ
- thisは自分自身のインスタンス(オブジェクト)を指し示す
- フィールドやメソッドに付加でき、コンストラクタはthis()として利用できる
- 変数名にthisを付加するとフィールドとなる
- コンストラクタから他のコンストラクタを呼び出す際には「this(引数)」として利用できる
- 「this(引数)」はコンストラクタ内部の先頭にしか記述できない