パソコン内でのインスタンス化の仕組み(ヒープ領域の使用)
Javaの仮想世界は、
コンピューターのメモリ領域(ヒープ領域)の中にある
なので、Javaがプログラムを実行する時は
JVM(Javaを動かす動作主)が仮想世界を実現させるためにメモリ領域をまず準備する
私たちがnewを用いてインスタンスを生み出すとき
ヒープ領域の一部がインスタンスの情報を格納するために使われている
⇩
この原理だと・・・
大きなクラス→newする場所が増える
よって、インスタンス化すると多くのヒープ領域を消費する
インスタンスは仮想世界では実体のイメージだが、
実際のパソコンの中では単なる「ヒープの中に確保されたメモリ領域」
イメージではなく、
パソコンの中でどのような仕組みでインスタンス化されているのか
① インスタンスの生成
h =new Hero( );
あらかじめ確保されていたメモリ領域の先頭番地の情報が変数hに代入される
ex.392番地
変数hに入っているアドレス情報→参照という
② フィールドへの値の代入
h.hp=100;
1. まずJVMは変数hの中身を調べる
→392番地というアドレス情報が入っていることを確認
2. 該当箇所の値を書き換える
→ メモリ内の392番地に行き、インスタンスのメモリ領域にアクセスし、
その中のhpフィールド部分を100に書き換える
もし仮想世界に2人の勇者を生成した場合
h1,h2とそれぞれ違う変数の箱が用意されるので、
箱の中身の勇者の内容は同じでもお互いに影響を受けない
⇨ インスタンスの独立性
h1の勇者のhpフィールドを書き換えても、
h2に入っている勇者のhpの値はそのままになる
ex.〈 同じ勇者クラスの金型を使って、同じ勇者を2人生成する〉
class main{ // mainクラス
static void main(String[ ] args){ //mainメソッド
Hero h1=new Hero( ); // ①勇者インスタンス1人目生成
h1.hp=100; // ② クラスに定義してあったフィールドに具体的な値を代入
Hero h2=new Hero( ); // ①勇者インスタンス2人目生成
h2.hp=200; // ② クラスに定義してあったフィールドに別の具体的な値を代入
System.out.println(h1.hp); //1人目の勇者hpを出力させてみる
}
出力 100 ←h2のhpの代入の影響は受けていない
! newしていない場合は変数の箱が用意されていないので、どちらかの値を書き換えると両方の値が変わってしまうので注意
インスタンスを生み出す方法はnewだけなので、
newをしていないといくら違う変数を作っても
同じインスタンスを指すことになる(実質1人しか作成出来ていないということ)