コース一覧
    Java入門:クラスとオブジェクト
    this キーワード

    Java入門:クラスとオブジェクト

    クラスとオブジェクトの設計を学び、状態と振る舞いを持つJavaプログラムを組み立てられるようにします。

    1
    クラスとオブジェクト
    01. クラスを定義する5分
    02. クラスにフィールドを持たせる12分
    03. クラスにメソッドを定義する5分
    04. インスタンスを作る5分
    05. コンストラクタ5分
    06. this キーワード5分
    07. カプセル化 (private と getter)12分
    08. Person クラスを作る5分
    09. Product クラスで税込価格15分
    10. 銀行口座クラス15分
    11. toString のオーバーライド5分
    12. クラスとオブジェクト クイズ5分
    13. Java 入門 最終クイズ5分

    this キーワード

    代入したはずなのに、null のまま

    前のレッスンのコンストラクタは、引数名を n a と 1 文字にして、フィールド名とぶつからないようにしていました。ただ、これは読む側にはつらい書き方です。n が名前なのか番号なのか、宣言まで戻らないと分かりません。

    そこで引数名をフィールドと同じ name weight に揃えると、今度は別の問題が起きます。

    Java

    class Cat {
        String name;
        int weight;
    
        Cat(String name, int weight) {
            name = name;
            weight = weight;
        }
    }
    
    Cat c = new Cat("タマ", 3);
    System.out.println(c.name);   // null

    コンパイルは通ります。実行もできます。それなのに null が出ます。

    近い方の name が勝つ

    Cat(String name, int weight) の中には name が 2 つあります。フィールドの name と、引数の name です。同じ名前が 2 つある場所で Java が選ぶのは、より近い方、つまり引数の name です。

    だから name = name; は「引数の name に、引数の name を入れ直す」だけの、何も起きない文になります。フィールドは一度も触られていないので null のままです。エラーが出ないぶん、原因にたどり着くまでが長くなります。

    this. を付けて、遠い方を名指しする

    このとき使うのが this です。

    Java

    Cat(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    this は「いま作られている、この 1 匹」を指す言葉です。this.name と書けば、近くにある引数を飛び越して、その猫が持っているフィールドの name に届きます。右辺の name は引数のままなので、1 行が「フィールドの name に、引数の name を入れる」と素直に読めます。

    this. はコンストラクタ専用の道具ではありません。フィールドを書き換えるふつうのメソッドでも、引数に同じ名前を使いたければ同じように付けます。

    Java

    void rename(String name) {
        this.name = name;
    }

    引数名を短縮せずに済むので、結果としてコードは読みやすくなります。

    解説

    this が使えるのは、インスタンスに属するコンストラクタとメソッドの中だけです。static の付いたメソッドの中で書くと non-static variable this cannot be referenced from a static context というエラーになります。static は特定の 1 匹ではなくクラスそのものに属するので、指す相手がいないからです。

    やってみよう

    右のエディタで describeBook(String title, int price) を完成させます。本のタイトルと値段を受け取って、表示用の 1 本の文字列にして返すメソッドです。半角スペースやカッコの位置は、課題の要件どおりに 1 文字ずつ合わせてください。

    このメソッドは static なので、中では this を使えません。緑になったら、Book クラスを自分で書いて、タイトルと値段をコンストラクタで this. 付きで受け取り、同じ文字列を返すメソッドを持たせる形に組み直してみてください。this. を 1 か所わざと外して、null や 0 が出るところまで見ておくと、次に同じバグを踏んだとき一瞬で気づけます。

    要件

    1. クラス名は Solution、メソッド名は describeBook のままにすること
    2. 戻り値は title + " (¥" + price + ")" の書式の String
    3. 半角スペース、半角カッコ ( )、円記号 ¥ の位置と種類を正確に揃えること

    ヒント

    Java の文字列連結は `+` 演算子で書けます。`title + " (¥" + price + ")"` のようにつなげましょう

    `¥` は半角ではなく、全角の円記号 `¥` (U+FFE5) を使います。コピーして貼り付けるのが安全です

    `(` の前と `¥` の後ろに余計なスペースが入っていないか、`)` の前後も含めて目で見比べると間違いを防げます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • カプセル化 (private と getter)

      `private` フィールドと `public` な getter / setter を使って、データを安全に守る「カプセル化」を学ぼう。負の入金を弾く `safeAccount(int initial, int deposit)` を書く。

    • Person クラスを作る

      Person クラスを設計しながら、フィールド・コンストラクタ・メソッドの基本を身につけよう。インスタンスから自己紹介の文字列を取り出す課題に挑戦する。

    • Product クラスで税込価格

      商品を表す Product クラスを設計し、税込価格を返すメソッドをクラスの中に閉じ込める練習を通じて、オブジェクト指向の最小単位を体に馴染ませる。

    • 銀行口座クラス

      残高という状態を持つ Account クラスを設計し、deposit / withdraw / getBalance を通して「データとふるまいをひとまとめにする」というオブジェクト指向のうま味と、validation を内側に閉じ込める設計を体に馴染ませる。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • コンストラクタインスタンス生成時の初期化処理
    • 引数位置引数=順番で渡す。
    • フィールドクラスが持つデータ
    • コンパイルソースをバイトコードへ変換する処理
    • メソッドクラスに属する関数
    • インスタンスクラスから生成された実体
    • クラスデータと振る舞いを束ねる単位
    • 戻り値呼び出し元への返答を表す点線矢印
    main.java
    エディタを読み込んでいます

    メモ

    this キーワード

    ⌘S で保存