実際に書いて覚える!Javaのthisの使い方【初心者向け】
初心者向けにJavaのthisの使い方について解説しています。これはインスタンス自身を表す特別な変数です。thisが必要になる場面と使用例を見ていきましょう。実際にソースコードを書いて説明しているので、ぜひ参考にしてみてください。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Javaのthisの使い方について解説します。
実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。
そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。
今回は、Javaに関する内容だね!
どういう内容でしょうか?
thisの使い方について詳しく説明していくね!
お願いします!
thisとは
Javaにおけるthisは、インスタンスそれ自身を表すキーワードです。
thisの使い方
あるインスタンスのメソッドを呼び出すコードは、通常「obj.foo( )」という形式で表されます。
メソッドの前に「obj」と付けることで、どのインスタンスのメソッドであるかが識別できるというわけです。
フィールドの参照についても同じく「obj.name」の形式で表すことができます。
上記はインスタンスobjを使う側での呼び出し方でしたが、ではメソッドfoo( )の中で、自分自身のnameフィールドを参照したい場合はどのように表現すればよいでしょうか?
答えは以下のとおりです。
「インスタンス自身」を表す「this」を付けて、「自分自身のフィールドname」を表現することができます。
public String name; public void foo() { System.out.println("name=" + this.name); }
さてここで、あなたがこれまでに書いたコードを振り返ってみてください。thisなんか使わなくてもフィールド参照できてたよ!という人もいるかと思います。
実際その通りで、自分自身のフィールドやメソッドを呼び出すときは、thisを省略することもできます。以下はさきほどのコードと全く同じです。
public String name; public void foo() { System.out.println("name=" + name); }
thisを付けても付けなくても同じ結果になるなら、ではどんなときにthisが必要なのでしょうか?
それは、「メソッド内にフィールドと同じ名前のローカル変数があるとき」です。
何も付けないと、メソッド内で定義したローカル変数の方が優先されるので、フィールドを参照することができません。その場合は明示的に「this」を付けてフィールドを参照することになります。
最もわかりやすい例は、フィールドのsetterですね。
ローカル変数(引数)nameの値をフィールドnameに代入する、といったコードの場合はフィールドに「this」を付けなければいけません。
private String name; public void setName(String name) { this.name = name; }
実際に書いてみよう
次のコードでそれぞれのタイミングで「num」の値がどのように出力されるのか、考えながら読んでみましょう。
class NumberHolder { private int num; NumberHolder(int num) { this.num = num++; System.out.println("constructor: num=" + this.num); } public void printNum() { int num = this.num * 2; System.out.println("printNum()(1): num=" + num); this.num = num; num = 0; System.out.println("printNum()(2): num=" + this.num); } } class Main { public static void main(String[] args) { NumberHolder holder = new NumberHolder(10); holder.printNum(); } }
監修してくれたメンター
青柳哲夫
独立系SIerやベンチャーを経て、現在はフリーランスエンジニアとして活動しています。 PHPやJava・Rubyでの業務系Webアプリケーション開発が得意です。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。