クラスとインスタンスを理解する
クラスはオブジェクトの型と振舞いを定義し、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は実体を生成する。
- インスタンスフィールドは実体ごとに別の値を持つ。
- 変数への参照代入は実体の複製ではない。
- nullのインスタンスメンバーへアクセスすると例外。
間違えやすい点
- 参照変数を宣言しただけで実体ができると思わない。
- 二つのnewと二つの参照変数を同一視しない。
- インスタンスのフィールドをクラス名だけで参照しない。
用語解説
- クラス
- フィールドやメソッド等を定義する型。
- インスタンス
- クラスを基に生成した具体的なオブジェクト。
- インスタンスフィールド
- 各実体が個別に持つ状態を表す変数。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。