お疲れ様です。
はるさらと申します。
今回はJavaのthisについて
個人的に理解が足りていなかったため
調べたことを記載していこうと思います。
Javaの this
キーワードは、
「自分自身(現在のオブジェクト)」を指すための便利な機能です。
ただ、いまいち「いつ・なぜ使うのか」が
私の様に分かっていない方もいるのかなと思います。。
この記事では、this
の基本的な意味と使い方を、
サンプルコード付きで丁寧に解説していきます。
thisとは?
Javaの this
は、現在のインスタンス(オブジェクト)自身を
指し示すキーワードです。
主に以下のような場面で使われます:
◆thisの主な使い方:
- インスタンス変数とローカル変数の区別
- コンストラクタから別のコンストラクタを呼び出す(オーバーローディング)
- 現在のオブジェクトをメソッドから返す
このように、this
を使うことで、
より明確で正確なコードを書くことができます。
上記を見ても何のことかわからなくても大丈夫です!
これからそれぞれについて詳しく説明していきます。
インスタンス変数とローカル変数の区別
同じ名前の変数が複数存在する場合、this
を使って インスタンス変数(フィールド)を
明示的に指定することができます。
class Person {
private String name;
public Person(String name) {
this.name = name; // thisを使ってインスタンス変数を区別
}
public void showName() {
String name = "Local Name"; // ローカル変数
System.out.println(this.name); // インスタンス変数
System.out.println(name); // ローカル変数
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("John");
person.showName();
}
}
◆実行結果
John
Local Name
◆ポイント
this.name = name;
のように書くことで、
「引数nameの値を、インスタンス変数nameに代入している」ことが
はっきり分かります。
コンストラクタから別のコンストラクタを呼び出す
クラス内で複数のコンストラクタを用意する場合、
共通処理を一か所にまとめるために、
他のコンストラクタを呼び出すことがよくあります。
その際に使うのが this()
です。
class Person {
private String name;
private int age;
public Person() {
this("Unknown", 0); // 別のコンストラクタを呼び出す
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void showInfo() {
System.out.println("Name: " + this.name + ", Age: " + this.age);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.showInfo(); // Name: Unknown, Age: 0
Person person2 = new Person("John", 30);
person2.showInfo(); // Name: John, Age: 30
}
}
◆実行結果
Name: Unknown, Age: 0
Name: John, Age: 30
◆注意点
this()
は コンストラクタの先頭でのみ呼び出すことができます。super()
との併用はできません。どちらか一方のみ先頭に書く必要があります。
そもそもコンストラクタとは?
コンストラクタとは、オブジェクトを作るときに
自動的に呼び出される特別なメソッドです。
主に、インスタンス変数に初期値をセットするために使います。
Person person = new Person("John");
このように new
を使ってオブジェクトを生成するときに呼ばれるのが、
クラスと同じ名前を持つこの部分です:
public Person(String name) {
this.name = name;
}
・クラス名と同じ名前
・戻り値を書かない(void
も不要)
・インスタンス生成時に1回だけ自動で実行される

現在のオブジェクトをメソッドから返す
自分自身(現在のオブジェクト)を返したい場合、this
を使うことで簡単に実現できます。
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public Person getPerson() {
return this; // 現在のオブジェクトを返す
}
public void showName() {
System.out.println("Name: " + this.name);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("John");
person.getPerson().showName(); // Name: John
}
}
◆実行結果
Name: John
応用例:メソッドチェーン
ここではあまりしっかりとは触れませんがthis
を返すことで、以下のように
メソッドを連続して呼び出す「メソッドチェーン」も
可能になります。
class Person {
private String name;
private int age;
public Person setName(String name) {
this.name = name;
return this; // 自分自身を返す
}
public Person setAge(int age) {
this.age = age;
return this; // 自分自身を返す
}
public void showInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person()
.setName("Alice")
.setAge(25); // メソッドチェーンで連続呼び出し!
person.showInfo(); // Name: Alice, Age: 25
}
}
◆実行結果
Name: Alice, Age: 25
◆解説
- 各セッター(
setName
やsetAge
)がthis
を返しているため、new Person().setName(...).setAge(...)
のように連続して呼び出せます。 - これは 「メソッドチェーン」 と呼ばれ、コードをスッキリ書けるテクニックです。

thisを使わないとどうなる?
以下のように this
を使わないと、
インスタンス変数に値が設定されない
というミスを招くことがあります。
class Person {
private String name;
public Person(String name) {
name = name; // ローカル変数を自分自身に代入しているだけ
}
public void showName() {
System.out.println("Name: " + name);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("John");
person.showName(); // 出力: null
}
}
◆なぜ?
name = name;
は、引数nameの値を、
引数name自身に代入しているだけです。
インスタンス変数this.name
を指定しないと、
正しく代入されません。
thisが使えない場所もある?
this
は インスタンスが存在している場合にのみ有効です。
そのため、static
メソッドの中では
this
は使えません。
public class Sample {
private String name;
public static void printName() {
// System.out.println(this.name); // コンパイルエラー!
}
}
staticとは?
static
は「クラス全体に属する」ことを意味し、
インスタンスを作らずに使えます。
逆に言えば、「インスタンス(オブジェクト)が無い」状態なので
this
も存在しません。
まとめ
Javaの this
キーワードは、
**「現在のインスタンス(自分自身)を指し示すもの」**です。
- インスタンス変数とローカル変数の区別
- コンストラクタのオーバーローディング
- 現在のオブジェクトを返す
初心者のうちは、少しややこしく感じるかもしれませんが、
thisの役割が分かるとJavaのクラス設計が一気に理解しやすくなります。
まずはサンプルコードを写経して、
実際に手を動かしてみることで理解が深まるでしょう。
どなたかのお役に立てば幸いです。
それではまたー!!