Java の this キーワードとは?自分自身のオブジェクトを指す
新人
「先輩、Javaのthisキーワードって、よく見るけど意味がよくわかりません。何のために使うんですか?」
先輩
「それはね、自分自身のオブジェクトを指すためのキーワードなんだ。たとえば、自分の名前を呼ぶようなものだよ。」
新人
「えっ、自分自身?どういうときに使うんですか?」
先輩
「いい質問だね。これからthisキーワードの意味と使い方を、わかりやすく説明していくよ。」
1. thisキーワードとは?(やさしく解説)
Javaのthisキーワードは、「自分自身のオブジェクト」を指すために使うキーワードです。言いかえると、今動いているオブジェクトそのものを表しています。
たとえば、人を表すPersonクラスがあったとします。その中で自分の名前を表示したいとき、「自分の名前」はthis.nameのように書くことで、そのオブジェクト自身のnameを指すことができます。
public class Person {
String name;
void sayName() {
System.out.println("私の名前は " + this.name + " です。");
}
}
このように、this.nameと書くと「このオブジェクトのname」という意味になります。自分自身の中にあるデータを使うときに便利なのが、このthisキーワードです。
Javaでは、オブジェクトを作って動かすのが基本なので、このthisキーワードを理解することがとても大切です。初心者のうちはピンとこないかもしれませんが、実際にコードを書くと意味がわかってきます。
2. なぜthisが必要なのか?(使う場面と理由)
では、「なぜthisをわざわざ使うのか?」という疑問が出てくると思います。その理由のひとつが、**フィールド名とメソッドの引数が同じ名前のときに区別するため**です。
たとえば、クラスの中にnameというフィールドがあり、メソッドにもnameという引数があるとします。そんなとき、どっちのnameを指しているのかがわからなくなってしまいます。
そのような場面で、thisを使えば「自分自身のフィールドだよ」と明確に伝えることができます。
public class Person {
String name;
void setName(String name) {
this.name = name;
}
}
このコードでは、setNameというメソッドの引数もname、クラスのフィールドもnameです。this.name = name;と書くことで、「左側のthis.nameはこのクラスのフィールド」、「右側のnameはメソッドの引数」と明確に区別できるのです。
もしthisを使わずにname = name;と書くと、Javaは両方とも引数のnameだと判断してしまい、フィールドに値を設定できません。
つまり、thisは「クラスの中の変数(フィールド)」をきちんと指定するために必要なのです。
もうひとつ例を見てみましょう。
public class Student {
String name;
int age;
void setInfo(String name, int age) {
this.name = name;
this.age = age;
}
void showInfo() {
System.out.println("名前:" + this.name);
System.out.println("年齢:" + this.age + "歳");
}
}
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.setInfo("さくら", 18);
s.showInfo();
}
}
名前:さくら
年齢:18歳
このように、thisを使うことで、同じ名前の変数があっても間違えずに正しくデータを扱うことができます。
Javaの初心者向けに言えば、「thisは“自分自身”と覚えておくといい」です。何かを代入したり、表示したりするときに、「このオブジェクトのこの変数ですよ」とはっきり指定できるのが、thisキーワードの強みなのです。
Pleiadesで実際にこのサンプルを打ち込んで動かしてみると、仕組みがよくわかります。ぜひ手を動かして試してみてください。
3. thisを使った実践例(フィールドと引数が同じ名前のとき)
Javaでthisキーワードを使う場面の代表例が、クラスのフィールドと引数が同じ名前になる場合です。初心者向けにわかりやすくするため、ここでは「名前」と「年齢」の情報をセットするsetInfoメソッドを使って説明します。
まずはthisを使った正しい例を見てみましょう。
public class Student {
String name;
int age;
void setInfo(String name, int age) {
this.name = name;
this.age = age;
}
void printInfo() {
System.out.println("名前:" + this.name);
System.out.println("年齢:" + this.age + "歳");
}
}
このようにthis.name = name;と書くことで、左側は「フィールドのname」、右側は「引数のname」であると区別することができます。これはJava初心者にとって非常に重要なポイントです。
実際にこのクラスを使ってオブジェクトを作ると、次のようになります。
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.setInfo("りんご", 17);
s.printInfo();
}
}
名前:りんご
年齢:17歳
このように、thisを使うことで、Javaの初心者でも混乱せずにデータを正しく扱うことができます。フィールドと引数の名前が重なる場面では、thisが欠かせません。
4. thisを使わないとどうなる?(混乱しやすいコードとの比較)
ここでは、あえてthisを使わずに書いた場合に、どのような問題が起こるかを見てみましょう。
public class Student {
String name;
int age;
void setInfo(String name, int age) {
name = name;
age = age;
}
void printInfo() {
System.out.println("名前:" + name);
System.out.println("年齢:" + age + "歳");
}
}
このコードは、一見正しそうに見えますが、実はフィールドに値が代入されていません。なぜなら、name = name;やage = age;と書いた場合、両方とも引数を指してしまい、フィールドのnameやageに代入されないのです。
つまり、何も設定されていない状態のままになってしまい、出力してもnullや0といった初期値しか表示されません。
名前:null
年齢:0歳
このようなバグは、初心者が書くコードによく見られるミスです。ですが、thisを使えば、こうしたバグを防ぐことができます。
「どの変数に代入しているのか」が明確になり、クラスの中のデータを正しく操作できるようになるのです。Javaの基本として、thisは正確なコードを書くための大切な道具になります。
5. オブジェクト指向におけるthisの役割(自分自身を指すとは?)
Javaは「オブジェクト指向」と呼ばれる考え方に基づいて作られた言語です。その中でthisキーワードは、「オブジェクト自身が自分のことを指すための名前」として使われます。
たとえば、クラスという「設計図」からオブジェクトを作ると、そのオブジェクトはそれぞれ独立した存在になります。そして、メソッドの中でthisを使えば、「いま動いているこのオブジェクト自身」が対象になるのです。
イメージとしては、複数の人がいて、それぞれが「私は〇〇です」と言うとき、「私」が誰なのかは、その人自身によって変わります。thisも同じように、オブジェクトごとに「私(this)」が変わるのです。
public class Person {
String name;
void introduce() {
System.out.println("こんにちは、私は" + this.name + "です。");
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "たろう";
Person p2 = new Person();
p2.name = "はなこ";
p1.introduce();
p2.introduce();
}
}
こんにちは、私はたろうです。
こんにちは、私ははなこです。
このように、同じintroduceメソッドでも、thisが指す内容はオブジェクトごとに違います。thisを使うことで、クラスを使いまわしても、きちんとそれぞれのデータを扱えるのです。
Java初心者の方にとっては、「thisは自分のデータを使うための名前」と覚えるのがわかりやすいでしょう。
Pleiadesの開発環境で、ぜひ複数のオブジェクトを作って、それぞれにthisを使ったメソッドを実行してみてください。自然とオブジェクト指向の考え方が身につき、Javaの基本的な使い方が理解できるようになります。
6. thisを使った複数メソッドでの応用(オブジェクト内の連携)
Javaのthisキーワードは、クラスの中で複数のメソッドが連携する場合にも役立ちます。オブジェクトの中で、あるメソッドから別のメソッドを呼び出すときにもthisを使うことがあります。
次の例を見てみましょう。
public class Calculator {
int number;
void setNumber(int number) {
this.number = number;
}
void doubleNumber() {
int result = this.number * 2;
System.out.println("2倍の値:" + result);
}
void runAll() {
this.setNumber(5);
this.doubleNumber();
}
}
public class Main {
public static void main(String[] args) {
Calculator c = new Calculator();
c.runAll();
}
}
2倍の値:10
このコードでは、runAllというメソッドの中から、同じクラス内のsetNumberとdoubleNumberを呼び出しています。そのときにthis.setNumber()やthis.doubleNumber()と書くことで、「このオブジェクト自身のメソッドを使いますよ」という意味を明確にしています。
もちろん、thisを省略しても動くことはありますが、Javaの初心者には、thisをつけることで「自分のメソッドや変数を使っている」と理解しやすくなります。
このように、複数のメソッドが連携する場面でもthisは役立つのです。クラスの中で自分自身の処理を呼び出すときにも使えると覚えておきましょう。
7. よくある間違いと初心者へのアドバイス(注意点とコツ)
Javaを始めたばかりの初心者がthisキーワードでよく間違えるポイントを紹介しながら、スムーズに学べるアドバイスをお伝えします。
まず、次のような間違いがよくあります。
public class Sample {
int value;
void setValue(int value) {
value = value; // よくある間違い
}
void showValue() {
System.out.println("値:" + value);
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
s.setValue(100);
s.showValue();
}
}
値:0
このコードでは、setValueの中でvalue = value;と書かれていますが、実は両方とも引数のvalueを指しています。そのため、フィールドのvalueには何も代入されていない状態になり、初期値の0が表示されてしまいます。
このようなミスを防ぐには、必ずthis.value = value;と書いて、「フィールドの方に代入する」と明確にしておく必要があります。
もうひとつのアドバイスは、「すべてのメソッドや変数にthisをつける必要はない」ということです。フィールドと引数が名前でかぶっていない場合は、thisを省略しても問題はありません。
ただし、混乱を防ぐために最初のうちはなるべくthisをつけるようにすると、コードの見通しがよくなります。
Java初心者の方がつまずかないために、以下のポイントを意識しておくとよいでしょう:
thisは「自分自身の変数やメソッド」にアクセスするときに使う- 引数とフィールドの名前が同じときは
thisで区別する - 他のメソッドを呼ぶときにも
this.メソッド名()で書ける - 使わないとバグの原因になることがあるので、意識して使う練習をする
Javaのthisキーワードは、最初は少し難しく感じるかもしれませんが、使えば使うほど便利さが実感できます。「自分自身を指す言葉」として、ぜひPleiadesで何度も使ってみてください。自然と身についていくはずです。