クラスとインスタンスを理解する

クラスはオブジェクトの型と振舞いを定義し、newで作るインスタンスは具体的な状態を持ちます。クラスの宣言、生成、参照、フィールドへのアクセスを区別して、複数の実体の値を追います。

この単元で学ぶこと

  • クラス宣言とインスタンス生成を区別する
  • 各インスタンスのフィールドの独立性を追う
  • 参照の共有とメソッド呼出しを判断する

本文解説

クラスを定義する class Box { int value; }はBox型とそのフィールドvalueを定義します。この宣言だけで操作対象のBox実体を一つ作るわけではありません。Javaファイルには公開クラスMainと、アクセス修飾子を付けないBoxを一緒に置くこともできます。

newで生成する Box b=new Box();ではnew Box()が実体を生成し、その参照をbへ入れます。b.value=3;で状態を設定し、System.out.print(b.value);は3です。型名Box、変数名b、フィールド名valueを役割ごとに読みます。

参照変数だけの宣言 main内でBox b;と書いただけでは初期化されません。b.valueを読むとコンパイルエラーです。Box b=null;なら変数は初期化済みですが実体がないためb.valueは実行時にNullPointerExceptionになります。

実体ごとの状態 Box a=new Box();Box b=new Box();a.value=2;b.value=5;ではa.valueは2、b.valueは5です。同じフィールド名でも格納場所は別です。片方への代入が全Boxへ伝わるわけではありません。

同じ実体への参照 Box a=new Box();Box b=a;ならb.value=9によりa.valueも9となります。newは一回だけで、二変数は同じ実体を参照します。参照をコピーする代入と実体を生成するnewを見分けます。

メソッドで状態を扱う class Box { int value; void add(){value++;} }ならb.add()でbの実体のvalueが増えます。メソッド定義そのものは宣言時に実行されず、呼出し時に本体を実行します。別のBoxに対する呼出しは別の状態を更新します。

型としての検査 Box b=new Box();のbにはBoxとして定義したメンバーだけを使えます。b.missingやBox.valueは、前者が未定義、後者がインスタンスを指定していないためエラーです。staticメンバーとの区別は後で詳しく扱います。

文字列や配列とのつながり 自分で作ったBoxもStringや配列と同じく参照で扱うオブジェクトです。==は参照が同じ実体を指すかを調べます。二つのBoxのvalueが同じでも別々にnewしたならa==bはfalseです。

図解

一つのクラスから二つの実体
クラスの定義は一つでも、newを二回行えば二つの実体を作る。

重要ポイント

  • クラス名は型として使い、newは実体を生成する。
  • インスタンスフィールドは実体ごとに別の値を持つ。
  • 変数への参照代入は実体の複製ではない。
  • nullのインスタンスメンバーへアクセスすると例外。

間違えやすい点

  • 参照変数を宣言しただけで実体ができると思わない。
  • 二つのnewと二つの参照変数を同一視しない。
  • インスタンスのフィールドをクラス名だけで参照しない。

用語解説

クラス
フィールドやメソッド等を定義する型。
インスタンス
クラスを基に生成した具体的なオブジェクト。
インスタンスフィールド
各実体が個別に持つ状態を表す変数。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。