facebook

【2025】Javaのthisとは?使い方やstatic・superとの違い、サンプルコードを解説

Javaのthisは、自分自身のオブジェクトを指し示すためのキーワードです。クラスやメソッドを正しく扱ううえで欠かせない概念であり、オブジェクト指向プログラミングを理解する第一歩となります。

この記事では、Javaのthisの概要から「static」との違い、実際に動かせるサンプルコード、さらに実務での活用事例までを初心者向けにわかりやすく解説します。

基礎をしっかり積み上げて、Javaエンジニアとしての確かなスキルとキャリアを築いていきましょう。

Javaのthisとは?

「this」は、Javaで自分自身のオブジェクトを指すキーワードです。クラスの中で、フィールド(変数)やメソッドを区別したいときに使われます。

【基本構文】
■クラス内のフィールドを指すとき
this.フィールド名;
■同じクラス内のメソッドを呼び出すとき
this.メソッド名();
■同じクラスの別のコンストラクタを呼び出すとき
this();

たとえば同じ名前の変数がメソッド内にある場合、「this」を使うことで「このクラスのフィールドですよ」と明示できます。これにより、プログラムの意図がはっきりし、バグ(誤動作)の防止にもつながります。

Javaのthisの使い方【サンプルコード】

実際のコードで「this」の使い方を確認してみましょう。クラスのフィールドとメソッドの中で「this」をどのように使うのかを見ていきます。

public class Person {
­­ ­­ String name; // フィールド(変数)

­­ ­­ // コンストラクタ
­­ ­­ public Person(String name) {
­­ ­­ ­­ ­­ this.name = name; // thisでフィールドと引数を区別
­­ ­­ }

­­ ­­ // メソッド
­­ ­­ public void introduce() {
­­ ­­ ­­ ­­ System.out.println(“こんにちは、” + this.name + “です!”);
­­ ­­ }

­­ ­­ public static void main(String[] args) {
­­ ­­ ­­ ­­ Person person = new Person(“太郎”);
­­ ­­ ­­ ­­ person.introduce();
­­ ­­ }
}

このサンプルには、Personクラスに「名前」を表すフィールドnameがあります。コンストラクタの引数にも同じ名前のnameがあるため、「this.name = name;」と書くことで、「左側はクラスのフィールド、右側は引数」であることを区別しています。

また、introduce()メソッドの中では、「this.name」を使ってそのオブジェクト自身のnameを参照し、”こんにちは、太郎です!”と出力しています。

このように「this」は、自分自身のオブジェクトを明確に示すためのキーワードです。同じ名前の変数があるときの混乱を防ぎ、コードの意図をわかりやすくしてくれます。Javaの基礎として早い段階で慣れておくと、今後の理解がスムーズになるでしょう。

thisはつけるべき?つけないとどうなる?

Javaでは、「this」は必ず書かなければならないものではありません

ただし、「同じ名前の変数(フィールドと引数)」がある場合には必ず必要になります。thisを省略しても動作するケースはありますが、誤動作や意図しない代入を防ぐために、基本的には明示的に書くことをおすすめします

上でご紹介したサンプルコードを、thisをつけずに実行してみましょう。

public class Person {
String name;

­ ­­ public Person(String name) {
­ ­­ ­ ­­ name = name; // フィールドに代入しているつもりでも、実は引数に代入している
­ ­­ }

­ ­­ public void introduce() {
­ ­­ ­ ­­ System.out.println(“こんにちは、” + name + “です!”);
­ ­­ }

­ ­­ public static void main(String[] args) {
­ ­­ ­ ­­ Person p = new Person(“太郎”);
­ ­­ ­ ­­ p.introduce();
­ ­­ }
}

実行結果は次のようになります。
こんにちは、nullです!
コンストラクタ内で「name = name;」と書いた場合、右側も左側も引数のnameを指してしまいます。そのため、クラスのフィールドnameには値が代入されず、結果としてnullが出力されます。
一方で、「this.name = name;」と書くことで、「左側はこのクラスのフィールド」「右側は引数」であることを明確に示せるため、プログラムが正しく動作するのです。
thisは省略できる場面もありますが、曖昧さを避けるために常につける習慣を持つ方が安全です。「読みやすく、バグのないコード」を書く第一歩として、thisを積極的に使う意識を持ちましょう

Javaでできることについては、こちらで詳しく解説しています。

【2025】Javaでできること・できないことは?Javaの特徴を解説!

Javaのthisと「static」との違い

Javaのthisと「static」の違い

Javaのthisと混同されがちなものとして、「static」が挙げられます。staticとは、クラスに属するメンバーを表すキーワードです。

thisが「インスタンス(生成されたオブジェクト)」を指すのに対して、「static」はクラスそのものに関係する点に違いがあります。両者の違いをまとめてみましょう。

比較項目 this static
所属先 インスタンス(オブジェクト) クラス(全体)
使用できる場所 インスタンスメソッド、コンストラクタ内 クラスメンバー、クラスメソッド内
目的 自分自身のオブジェクトを指す 全体で共通して使う値やメソッドを定義
呼び出し方法 this.メンバー名 クラス名.メンバー名
インスタンスが必要か 必要(オブジェクトを生成して使う) 不要(クラスから直接呼び出せる)

このように、「this」は“今このオブジェクトの中で”を指すのに対し、「static」は“クラス全体で共通のもの”を扱います。両者はまったく逆の性質を持っており、うまく使い分けることが大切です。

Javaのthisと「super」との違い

Javaのthisと「super」との違い

thisとsuperは、どちらもクラスの中で他のメンバーを参照するときに使うキーワードですが、指す対象が異なる点に注意が必要です。thisは自分自身(現在のクラスのインスタンス)を指しますが、「super」は親クラス(スーパークラス)を参照します。

両者の違いも比較してみましょう。

比較項目 this super
指す対象 現在のクラスのインスタンス 親クラスのインスタンス
主な用途 自クラスのメンバー(フィールド・メソッド)を参照 親クラスのメンバーを参照または呼び出す
目的 同一クラス内での処理明示 継承構造で親クラスの機能を再利用

thisとsuperは、どちらもオブジェクト指向におけるクラス設計を理解するうえで欠かせない存在です。特に継承を使うプログラムでは、thisとsuperを正しく使い分けることで、親子関係の流れが明確で保守性の高いコードを書くことができます。

Javaのthisを動かすための環境構築

Javaのthisを動かすための環境構築

Javaのプログラムを動かすためには、まず「JDK(Java Development Kit)」をインストールする必要があります。JDKは、Javaの開発に必要なツールがすべて入っているセットです。

公式サイト(Oracle公式Javaダウンロードページ)から任意のバージョンのJDKをダウンロードし、画面の指示に従ってインストールを進めてください。

公式サイト(Oracle公式Javaダウンロードページ)

出典:Oracle公式サイト

Javaのバージョン選びのポイント
ダウンロードページでは、常に「最新版のJDK」が紹介されています。最新版を使うと、新しい構文や最適化された処理などの最新機能を試せるのがメリットです。
ただし、学習目的で「this」などJavaの基本を理解したい場合は、安定して使えるLTS(長期サポート)版の「JDK 17」がおすすめです。多くの教材や開発環境がJDK 17を前提にしているため、初心者でもトラブルなく進められます。

JDKを入れたら、次はプログラムを書くための開発環境を用意しましょう。初心者におすすめなのが「Eclipse」です。無料で使え、Javaの補完機能やデバッグ機能が充実しています。

ECLIPSE IDE公式サイト

出典:ECLIPSE IDE公式サイト

Javaのthisを使ったサンプルコードを実装してみよう

Javaのthisを使ったサンプルコード

Javaの環境構築ができたら、実際のサンプルコードを使って理解を深めていきましょう。ここでは、Javaのthisが実際にどのように使われるのか、よくある4つのケースをご紹介します。

  1. フィールド変数と引数を区別する例
  2. コンストラクタから他のコンストラクタを呼び出す例
  3. メソッドチェーンを実装する例
  4. 現在のオブジェクトを他メソッドに渡す例

①フィールド変数と引数を区別する例

「this」は、同じ名前の変数があるときにフィールドと引数を区別するためによく使われます。

public class Car {
­­ ­­ private String color;

­­ ­­ public void setColor(String color) {
­­ ­­ ­­ ­­ this.color = color; // フィールドと引数を区別
­­ ­­ }

­­ ­­ public void showColor() {
­­ ­­ ­­ ­­ System.out.println(“車の色は ” + color + ” です。”);
­­ ­­ }

­­ ­­ public static void main(String[] args) {
­­ ­­ ­­ ­­ Car car = new Car();
­­ ­­ ­­ ­­ car.setColor(“赤”);
­­ ­­ ­­ ­­ car.showColor();
­­ ­­ }
}

このコードでは、setColorメソッド内で同じ名前の引数colorを受け取り、this.colorを使ってクラスのフィールドに代入しています。thisがないと、どちらのcolorを指しているか分からなくなる点に注目してください。

②コンストラクタから他のコンストラクタを呼び出す例

複数のコンストラクタがある場合、this()を使うと共通の初期化処理をまとめられます

public class Student {
­­ ­­ String name;
­­ ­­ int grade;

­­ ­­ public Student() {
­­ ­­ ­­ ­­ this(“名無し”, 1); // 他のコンストラクタを呼び出し
­­ ­­ }

­­ ­­ public Student(String name, int grade) {
­­ ­­ ­­ ­­ this.name = name;
­­ ­­ ­­ ­­ this.grade = grade;
­­ ­­ }

­­ public void introduce() {
­­ ­­ ­­ ­­ System.out.println(name + “(” + grade + “年生)です。”);
­­ ­­ }

­­ ­­ public static void main(String[] args) {
­­ ­­ ­­ ­­ Student s1 = new Student();
­­ ­­ ­­ ­­ Student s2 = new Student(“花子”, 3);
­­ ­­ ­­ ­­ s1.introduce();
­­ ­­ ­­ ­­ s2.introduce();
­­ ­­ }
}

上の例では、「this(“名無し”, 1);」で他のコンストラクタを呼び出しています。こうすることで、初期化コードを1か所にまとめられ、メンテナンス性が上がります。

③メソッドチェーンを実装する例

thisを返り値として使うことで、メソッドを連続して呼び出せる(メソッドチェーン)仕組みを作れます。

public class BuilderExample {
­­ ­­ private String text = “”;

­­ ­­ public BuilderExample add(String str) {
­­ ­­ ­­ ­­ this.text += str;
­­ ­­ ­­ ­­ return this; // 自分自身を返す
­­ ­­ }

­­ ­­ public void print() {
­­ ­­ ­­ ­­ System.out.println(text);
­­ ­­ }

­­ ­­ public static void main(String[] args) {
­­ ­­ ­­ ­­ new BuilderExample()
­­ ­­ ­­ ­­ ­­ ­­ .add(“こんにちは、”)
­­ ­­ ­­ ­­ ­­ ­­ .add(“Javaの”)
­­ ­­ ­­ ­­ ­­ ­­ .add(“this!”)
­­ ­­ ­­ ­­ ­­ ­­ .print();
­­ ­­ }
}

上ではadd()メソッドの最後でthisを返しているため、add()を続けて呼び出すことができます。このような書き方は、ビルダー(Builder)パターンや設定クラスなどでよく使われます。

④現在のオブジェクトを他メソッドに渡す例

「this」を使うと、自分自身のオブジェクトを引数として他のメソッドに渡すことができます。

public class Player {
­­ ­­ String name;

­­ ­­ ­­public Player(String name) {
­­ ­­ ­­ ­­ this.name = name;
­­ ­­ }

­­ ­­ public void start() {
­­ ­­ ­­ ­­ Game.begin(this); // 自分自身を渡す
­­ ­­ }
}

class Game {
­­ ­­ public static void begin(Player p) {
­­ ­­ ­­ ­­ System.out.println(p.name + ” がゲームを開始しました!”);
­­ ­­ }

­­ ­­ public static void main(String[] args) {
­­ ­­ ­­ ­­ Player player = new Player(“ユウ”);
­­ ­­ ­­ ­­ player.start();
­­ ­­ }
}

ここでは、Playerクラスのstart()メソッドでthisを使い、Gameクラスに「自分自身」を渡しています。このような使い方は、イベントリスナーやコールバック処理でよく登場します。

Javaのthisを理解できる7ステップの学習ロードマップ

Javaのthisを理解するための学習方法

Javaの「this」自体は難しい概念ではありませんが、クラス・フィールド・メソッド・インスタンスといった基本要素が結びつくことで初めて意味を持ちます。つまり、thisは“Javaのオブジェクト指向を理解した証”ともいえるのです。

したがってJavaのthisをしっかり理解するためには、まずJavaの基礎構文やオブジェクト指向の仕組みをしっかりと身につけることが大切です。

具体的には、次のようなステップで学習を進めるとよいでしょう。

  1. クラスとインスタンスの仕組みを理解する
  2. フィールド・メソッド・コンストラクタの違いを整理する
  3. 小さなクラスを自分で書いてみる
  4. IDE(EclipseやIntelliJ)を使ってコードを動かす
  5. 他人のサンプルコードを読む
  6. “this”を使わない場合との比較をしてみる
  7. ミニプロジェクトを作って応用する

thisの理解は、単なるキーワード学習ではなく、オブジェクト指向の考え方そのものにつながります。一歩ずつ基礎を固めながら自分の手でコードを書いて確かめることで、Javaのthisを本当の意味で“使いこなせる”ようになるでしょう。

Javaの基礎理解を深めるためにおすすめのセミナーについて知りたい方は、こちらも参考にしてください。

【2025】おすすめJava講座5選を紹介!講座の選び方やポイントも解説

Javaのthisを正しく理解してプログラミングを始めよう

thisは、Javaの中でも特に「オブジェクト指向」を理解するうえで欠かせないキーワードです。自分自身のオブジェクトを指し示すことで、クラス設計やメソッド間の連携をより明確にし、ミスを防ぐことができます。

最初は抽象的に感じるかもしれませんが、サンプルコードを動かしながら手を動かすことで、自然と理解が深まります。基礎を大切に一歩ずつ積み上げていけば、実践的なスキルが着実に身についていくでしょう。

最新情報をチェックしよう!