thisを理解する
thisは現在のインスタンスを表す参照です。同名引数とフィールドを区別し、現在の実体のメソッドを呼ぶ、引数として渡す、戻り値にする使い方を確認します。this(...)のコンストラクタ呼出しとは構文の役割が異なります。
この単元で学ぶこと
- thisが表す実体を特定する
- フィールド・引数・別実体への参照を区別する
- this式とコンストラクタ委譲を区別する
本文解説
現在の受け手 Box a=new Box(),b=new Box();a.set(2);b.set(5);という呼出しでは、set内のthisは一回目にaの実体、二回目にbの実体を表します。thisが常に最初に作った実体を指すわけではありません。
同名引数を区別する void set(int n){this.n=n;}の左はフィールド、右は仮引数です。n=this.nなら逆にフィールド値を仮引数へコピーするだけです。文字列の似た二つの式でも代入方向を読むと状態の変化が異なります。
別の実体のフィールド void copy(Box other){this.n=other.n;}はotherの状態を現在の実体へコピーします。thisとotherは同じ型でも別の実体を指せます。同じ実体を渡した場合は自己代入になります。
現在のメソッドを呼ぶ この例では、インスタンスメソッド内のthis.add()とadd()はどちらも現在の受け手のaddを呼びます。thisを付けても別の実体を作りません。対象をnew Box().add()にすれば別実体への呼出しです。
引数として渡す helper.accept(this)は現在の実体の参照を引数へ渡します。受け取り側がフィールドを書き換えれば同じ実体の状態が変わります。thisを渡しても、Javaの値渡しという規則は変わりません。
自分自身を返す Box add(){n++;return this;}ならb.add().add()で同じ実体を二回更新できます。return new Box()なら戻り値は別実体になるため連鎖の対象が変わります。戻り値の型だけでなく実際に返す参照を読みます。
staticでは使えない staticメソッドは特定の受け手インスタンスを持たないためthisを使えません。mainもstaticなのでthis.nは不正です。明示的にBox b=new Box()を作りb.nを読むことは可能で、staticからインスタンスを扱うことすべてが禁止ではありません。
thisの再代入は禁止 this=new Box()は不正です。thisは現在の受け手を表す参照式であり、別の参照へ代入できる変数ではありません。一方this.n=3は受け手のフィールドへの代入です。この二つの変更対象を分けます。
図解
重要ポイント
- this.nは現在の受け手のフィールドn。
- thisはインスタンスメソッドやコンストラクタの文脈で使う。
- staticメソッドではthisを使えない。
- return thisは同じ実体への参照を返す。
間違えやすい点
- thisを新しい実体を作る演算と考えない。
- this.n=nの左右を同じ変数と思わない。
- this(...)を普通のメソッド内で呼ばない。
用語解説
- this
- 現在実行中のインスタンスメンバーの受け手を表す参照。
- 受け手
- obj.method()でobjが指す呼出し対象の実体。
- メソッドチェーン
- 参照を返すメソッドの結果へ続けてメソッドを呼ぶ記述。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。