Javaのthisを使用することで変数名が重複しても区別することができます。「メンバ変数とローカル変数の変数名を同じにして使用したい」と思ったことはありませんか?
thisを使えば変数名が同じでも区別して使用することができます。今回は、そんなthisについて、使い方の基礎から応用までわかりやすく解説していきます!
- 【基礎】thisとは
- 【基礎】thisの使い方
- 【発展】thisでstatic変数にアクセスするときの注意点
- 【発展】tsuperで親クラス(スーパークラス)の変数やメソッドを参照する方法
今回はこれらの方法を覚えるために、thisとは何か?意味や使い方を詳しく見ていきましょう!
なお、Javaの記事については、こちらにまとめています。
thisとは
初めにthisの意味と使い方を解説します。thisは同じ変数名やメソッド名があるときに、それらを区別するために使用します。
例えば、メンバ変数名とローカル変数名が同じ場合にはローカル変数が優先して参照されます。このときにメンバ変数を指定する場合にはthisをつけて対応します。
thisの使い方
メンバ変数とローカル変数
ここでは、変数名が同じメンバ変数とローカル変数を区別する方法を解説します。同じ変数名にthisを付けると、実行結果がどう変わるのかを次のプログラムを確認してみましょう。
class ThisSampleClass { private String str = "engineer"; public void print(String str) { System.out.println("str = " + str); System.out.println("this.str = " + this.str); } } public class Main { public static void main(String[] args) { String str = "samurai"; ThisSampleClass sc = new ThisSampleClass(); sc.print(str); } }
[実行結果]
str = samurai this.str = engineer
ここではthisを使ってメソッドの引数になっているローカル変数と、メンバ変数を区別して表示しています。これでthisを使ってローカル変数とメンバ変数を区別することができました!
別のコンストラクタを呼び出す
次にthisを使ってコンストラクタから、別のコンストラクタを呼び出す方法を解説します。次のプログラムで確認してみましょう。
class ThisSampleClass { private String str1; private String str2; ThisSampleClass(String str) { this("samurai", str); } ThisSampleClass(String str1, String str2) { this.str1 = str1; this.str2 = str2; } public void print() { System.out.println(str1); System.out.println(str2); } } public class Main { public static void main(String[] args) { String str = "engineer"; ThisSampleClass sc = new ThisSampleClass(str); sc.print(); } }
[実行結果]
samurai engineer
このプログラムでは引数が1つのコンストラクタから、thisを使って引数が2つのコンストラクタを呼び出しています。thisを使って別のコンストラクタを呼び出せることが確認できました!
コンストラクタの詳しい使い方はこちらの記事で詳しくしているのでぜひ確認してみてください!
static変数にアクセスするときの注意点
次にstatic変数にアクセスするときの注意点を解説します。static変数にアクセスするときは、”this.変数名”ではなく”クラス名.変数名”でアクセスしてください。
static変数にアクセスするときにthisを使うと、開発環境(Eclipseなど)から「static フィールド SampleClass.str には static にアクセスする必要があります」という警告が出ます。
動作に問題はありませんが、thisを使うとstatic変数を誤って変更してしまうなどのバグの原因になりやすいので注意してください。次のプログラムで確認してみましょう。
class ThisSampleClass { static String str; public void print(String str) { this.str = str; // this.変数名だと警告が出る ThisSampleClass.str = str; // クラス名.変数名ならOK System.out.println(ThisSampleClass.str); } } public class Main { public static void main(String[] args) { String str = "samurai"; ThisSampleClass sc = new ThisSampleClass(); sc.print(str); } }
[実行結果]
samurai
static変数にアクセスするときにthisを使うと警告が出ますが、”クラス名.変数名”なら警告が出ないことが確認できました!
superで親クラスの変数やメソッドを参照する
最後に、クラスを継承したときに使う”super”と”this”の使い方を解説します。クラスの継承は、クラス名の後に”extends”と”継承するクラス名”を書きます。
サブクラスはスーパークラスのメンバ変数やメソッドを継承しています。サブクラスにスーパークラスと同じ名前の変数やメソッドがある場合には、”super”と”this”を利用して区別します。このときの”this”は省略することもできます。
次のプログラムで確認してみましょう。
class SuperClassSample { String str = "SuperClass"; public String getSrt() { return str; } } class SubClassSample extends SuperClassSample { String str = "SubClass"; public String getSrt() { return str; } public void print() { System.out.println("super.str = " + super.str); System.out.println("this.str = " + this.str); System.out.println("str = " + str); System.out.println("super.getSrt() = " + super.getSrt()); System.out.println("this.getSrt() = " + this.getSrt()); System.out.println("getSrt() = " + getSrt()); } } public class Main { public static void main(String[] args) { SubClassSample scs = new SubClassSample(); scs.print(); } }
[実行結果]
super.str = SuperClass this.str = SubClass str = SubClass super.getSrt() = SuperClass this.getSrt() = SubClass getSrt() = SubClass
”super”と”this”を使って、スーパークラスとサブクラスのメンバ変数やメンバメソッドを区別して使うことができました!superの詳しい使い方はこちらの記事で詳しくしているのでぜひ確認してみてください!
まとめ
いかがでしたか?今回はthisの意味と使い方について解説しました。同じ名前の変数がある場合はthisを使うのを忘れないように注意してくださいね。もしthisの使い方を忘れてしまったらこの記事を確認してください!