【Javaの勉強】thisの使い方

2019年3月24日

thisは「自オブジェクトを表す」と言われていますが、その意味が少しわかりにくいので調べてみました。

thisの使い方

シンプルなコードを使って調べてみます。

実行結果インスタンス変数
メソッド内ローカル変数

6行目で「this.s」、7行目で「s」を指定していて、結果は「インスタンス変数」「メソッド内ローカル変数」になっています。

つまり、「this.s」で指定すると2行目のインスタンス変数を参照し、「s」だけだと7行目のメソッド内のローカル変数を参照していることになります。

図1

図1ではインスタンス化とオブジェクトを図示しています。

11行目でインスタンス化をし、testオブジェクトが生成されます。12行目ではこのtestオブジェクトのthisTestメソッドが呼び出されて、この中のメソッドが処理されます。

また、このメソッド内でさらにさらに変数sを宣言しています。この変数が有効なのはthisTestメソッド内のみですが、このメソッド内で普通に変数sを参照すると、このメソッド内のsを参照します。

そこで、thisキーワードを付けることによって、testオブジェクトの変数sを参照してくれるようになります。testオブジェクトの変数sというのは、図を見てわかるとおり、Test001クラス直下に宣言した変数sです。

このように、thisを付けると参照先が変わります。「自オブジェクト」というのがなかなか理解できず悩みましたが、つまりはクラス直下に宣言されたインスタンス変数というわけです。そして、メソッド内では同じ名前の変数を宣言することもできるので、それを区別するためにthisというのがあるのですね。

次のようにして、メソッド内ローカル変数を削除すると参照先は同じになります。

実行結果インスタンス変数
インスタンス変数

この場合はthisがあってもなくても良いことになりますが、どの変数を指定するかを明示するために付けておくことが推奨されています。

また、変数sをメソッドの引数として渡した場合も例1と同じ結果になります。

実行結果インスタンス変数
メソッド内ローカル変数

まとめ

this自体は「これ」というシンプルな英語なので、わかったつもりでこの項目をうっかり読み飛ばしてしまいがちですが、後々何を指すんだろう?とわからなくなります。また、参考書の説明も「自オブジェクト」とだけ書かれていて、読んでもいまいちわかりにくいというのもあります。

自分でコードを書いてみて、動きの違いを調べて理解するような感じかなと思います。