おすすめアイテムをいくつか紹介

広告ブロックがONになっていると表示されないことがあります。

【Java入門】thisキーワードとは?意味・使い方・注意点を初心者向けに解説!

お疲れ様です。
はるさらと申します。

今回はJavaのthisについて
個人的に理解が足りていなかったため
調べたことを記載していこうと思います。

Javaの this キーワードは、
「自分自身(現在のオブジェクト)」を指すための便利な機能です。
ただ、いまいち「いつ・なぜ使うのか」が
私の様に分かっていない方もいるのかなと思います。。

この記事では、this の基本的な意味と使い方を、
サンプルコード付きで丁寧に解説していきます。


thisとは?

Javaの this は、現在のインスタンス(オブジェクト)自身を
指し示すキーワードです。

主に以下のような場面で使われます:

◆thisの主な使い方:

  1. インスタンス変数とローカル変数の区別
  2. コンストラクタから別のコンストラクタを呼び出す(オーバーローディング)
  3. 現在のオブジェクトをメソッドから返す

このように、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

◆解説

  • 各セッター(setNamesetAge)が 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のクラス設計が一気に理解しやすくなります。

まずはサンプルコードを写経して、
実際に手を動かしてみることで理解が深まるでしょう。

どなたかのお役に立てば幸いです。
それではまたー!!