バナー画像

Javaのプログラムで頻繁に利用される「this」は自分のクラスのインスタンス変数やコンストラクタへのアクセス時に使用されます。

本記事では、Javaプログラムにおける「this」の基本的な使い方と意味合いについてご紹介していきたいと思います。

Javaのthisとは

ポテパンダの一言メモ

thisはインスタンス自身を表すJavaの言語仕様として定義された予約語(keyword)となります。

インスタンス自身のフィールドやメソッドを呼び出す際に利用する

thisの基本的な使い方としては、インスタンス自身のフィールド値やメソッドを呼び出す際に利用します。

thisを用いることで、明示的に自分自身のインスタンスのフィールドやメソッドを利用することを記述出来ます。

別のコンストラクタを呼び出す際に利用する

コンストラクタ内で別のコンストラクタを呼び出す際には「this()」を利用します。

引数の数を変えることによって同名コンストラクタを定義し、「this()」を用いて別コンストラクタを呼び出す方法が一般的です。

Javaサンプルコードでthisの使い方を確認しよう

ポテパンダの一言メモ

ここからはサンプルコードを掲載しながらthisの使い方を実際のコードでご紹介していきます。

まずは最も基本となる自身のフィールドを呼び出す方法

フィールドに設定された値を表示するサンプルコードで確認してみます。

import java.util.*;

public class Main {
    
    public static void main(String[] args) throws Exception {
        
        SampleClass sample = new SampleClass(); // ※1
        sample.execute(); // ※2
    }
}


class SampleClass {
    
    private String str = "Tiger"; ※3
    
    public void execute() {
        
        System.out.println(str); // ※4
        System.out.println(this.str); // ※5
        
    }
}

サンプルコードを実行した結果は下記の通りとなります。

Tiger
Tiger

まず※1の行でSampleClassのインスタンスを作成しています。

※2の行でインスタンス化したSampleClassのexecuteメソッドを実行しています。

※4と※5は「this」が記述されているかどうかの違いがありますが、※3の行のフィールド値を表示するコードとなっており、上記サンプルでの出力結果は全く同じ結果となります。

ポテパンダの一言メモ

このように「this」メソッドは基本的な使い方をする場合、省略することも可能な点がポイントです。

メソッド内で同名の変数を利用する場合にはthisで明示する必要がある

一方、「this」を必ず明記しなければいけないケースとしては同名の変数を利用する場合が挙げられます。

サンプルコードで確認していきましょう。

import java.util.*;

public class Main {
    
    public static void main(String[] args) throws Exception {
        
        SampleClass sample = new SampleClass();
        sample.execute("Dog"); // ※1
    }
}


class SampleClass {
    
    private String str = "Tiger"; // ※2
    
    public void execute(String str) { // ※3
        
        System.out.println(str); // ※4
        System.out.println(this.str); // ※5
        
    }
}

サンプルコードを実行した結果が下記の通りとなります。

Dog
Tiger

1つ目でご紹介したサンプルコードと出力結果が変わっていることがご確認頂けます。

1つ目のサンプルコードではSampleClassのexecuteメソッドに引数の設定がありませんでしたが、2つ目のサンプルコードではexecuteメソッドにフィールドと同名の変数が引数として設定されています。

同名の変数が定義されている場合には、「this」を利用することで参照する変数を明示することが可能となります。

まず※1の行でexecuteメソッドの引数に設定するStringの値を「Dog」と定義しています。

※4と※5の行では1つ目のサンプルコード同様、変数「str」の値を出力するコードが記述されていますがなぜ出力結果が変わるのでしょうか?

ポテパンダの一言メモ

メソッド内でフィールドと同名の変数を利用する場合には「this」を記述しない場合、ローカルで定義した変数が優先されます。

今回の場合、※3の行で定義された「str」の値、つまり「Dog」が優先される形となります。

※4の行では「this」が記述されていないため「Dog」が結果として出力されることになります。

一方、※5の行では「this」を記述しているため、※2の行で定義されたSampleClassのフィールド「str」の値「Tiger」が結果として出力されることになります。

Javaコンストラクタで利用するthis()を理解しよう

Javaでは上記でご紹介した「this」とは別に「this()」との記述が頻繁に利用されます。

コンストラクタの中で別のコンストラクタを呼び出す際に利用する「this()」をサンプルコードで確認していきましょう。

this()を利用して別のコンストラクタを呼び出す

import java.util.*;

public class Main {
    
    public static void main(String[] args) throws Exception {
        
        AnimalClass animal1 = new AnimalClass(); // ※1
        AnimalClass animal2 = new AnimalClass("ハチ"); // ※2
        AnimalClass animal3 = new AnimalClass("ポチ", 5, "犬"); // ※3
        
        System.out.println("引数を指定しないコンストラクタの呼び出し結果");
        animal1.execute();
        System.out.println("引数を1つだけ指定したコンストラクタの呼び出し結果");
        animal2.execute();
        System.out.println("引数を全て指定したコンストラクタの呼び出し結果");
        animal3.execute();
    }
}


class AnimalClass {
    
    private String name;
    private int age;
    private String type;
    
    AnimalClass() { // ※4
        this("unknown", 99999, "不明");
    }
    
    AnimalClass(String name) { // ※5
        this(name, 99999, "不明");
    }
    
    AnimalClass(String name, int age, String type) { // ※6
        this.name = name;
        this.age  = age;
        this.type = type;
    }
    
    public void execute() {
        
        System.out.println("name= " + name);
        System.out.println("age= " + age);
        System.out.println("type= " + type);
        
    }
}

サンプルコードを実行した結果が下記の通りとなります。

引数を指定しないコンストラクタの呼び出し結果
name= unknown
age= 99999
type= 不明
引数を1つだけ指定したコンストラクタの呼び出し結果
name= ハチ
age= 99999
type= 不明
引数を全て指定したコンストラクタの呼び出し結果
name= ポチ
age= 5
type= 犬

※1の行では引数を指定しない状態でインスタンスを作成しています。

サンプルコードの場合、※4のコンストラクタが呼び出されることになりますがコンストラクタの中で「this()」を利用していることがご確認頂けます。

「this()」に引数を指定することでJavaの「オーバーロード」の機能を利用して、引数の数に応じたコンストラクタ(※6)を呼び出しています。

引数を指定した状態でインスタンスを作成している※3の行では、いきなり※6の該当するコンストラクタが呼び出され、出力結果として指定した名前や年齢といった情報が表示されています。

また、応用として名前だけがわかる状態でインスタンスを作成したケースとして※2の行を掲載しています。

引数を1つだけ指定した場合には※5のコンストラクタが呼び出され、「this()」を用いて不明な部分の引数を初期値として設定しておき、最終的に※6のコンストラクタが呼び出される結果となっています。

さいごに:thisはインスタンス自身を呼び出すと覚えておこう

本記事では、Javaプログラミングにおける「this」の定義と使い方をご紹介していきました。

thisの使い方をしっかりと把握しておくことで、よりオブジェクト指向への理解も深まります。

きちんとthisを使えば可読性の高いコードを記述出来ることにも繋がりますので、しっかりと理解出来るように学習してみてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。