はじめに
こんにちは(・ω・)ノ
今回はコンストラクタについて学びました!
第9章 さまざまなクラス機構
1.クラス型と参照
今までのイメージ...仮想世界
↓
実際は...「コンピュータのメモリ領域」
ヒープ...JVMが大量にメモリ領域を使って準備するもの
インスタンスとは、「ヒープの中に確保されたメモリ領域」
インスタンスが生まれる時のコンピュータの動き
以下のコードを参考![]()
public class Main{
public static void main (String[] args){
Hero h;
h = new Hero();
h.hp = 100;
}
}
Step1.Hero型変数の確保
最初に動くのが3行目の「Hero.h;」
⇨「Hero型の変数h」をメモリ内に準備する
Hero型のインスタンスだけが入れることのできる箱が準備される
Step2.Heroインスタンスの生成
4行目「h = new Hero();」の代入文を実行する
代入は右辺が先に評価される
「new Hero()」でJVMがヒープ領域から必要なメモリを確保する
仮に3922番地から3945番地を確保できたとする
ここで仮想世界に存在が生まれたが属性はない状態
Step3.参照の代入
右辺の実行後の4行目...「h = 右辺の実行結果」
hには何が入るか?
❌勇者のインスタンス
⭕️newによって生成されるインスタンスのために確保された先頭番地
変数hには3922という数値が代入される
変数hに入っているアドレス情報...参照
配列型とクラス型の総称...参照型
Step4.フィールドへの値の代入
5行目「h.hp = 100;」の実行
JVMの解釈と動き
1.変数hの内容を調べて「3922番地を参照」と書いてある
2.3922番地のインスタンスのメモリ領域へアクセス、その中のhpフィールドを書き換える
変数から番地情報を取り出し、次にその番地にアクセスする
⇨参照の解決やアドレス解決
同じクラスから生まれた異なるインスタンス
お互いに影響を受けない...インスタンスの独立性
あるクラスが別のクラスをフィールドとして利用している関係...has-aの関係
String型は実は「クラス型」
APIとして標準添付されている
Java.langパッケージで宣言されている
””で文字を囲めばインスタンスを生成して利用できる
2.コンストラクタ
newで生まれたインスタンスには初期値しかない
フィールドの初期値
int型などの数値の型...0
char型(文字)...¥u0000
boolean型...false
int[]型などの配列型...null
String型などのクラス型...null
newされた直後に自動的に実行されるメソッド...コンストラクタ
コンストラクタは直接呼び出せない
コンストラクタはインスタンスの生成時にJVMによって呼び出されるものであり、
開発者がプログラムで直接呼び出す手段は用意されていない
コンストラクタとみなされる条件
1.メソッド名がクラス名と完全に等しい
2.メソッド宣言に戻り値が記述されていない(voidもダメ)
コンストラクタの定義
public class クラス名 {
クラス名(){
自動的に実行する処理
}
}
コンストラクタに情報を渡す
渡すべき引数をnewするときに指定する
複数のコンストラクタが適宜されていた場合
newするときに渡した引数の型・数:・順番に一致するコンストラクタが動作する
(動作するコンストラクタは1つのみ)
すべてのクラスはインスタンス化で必ず何らかのコンストラクタを実行する
本来すべてのクラスは最低でも1つ以上のコンストラクタが必要
コンストラクタの特例
クラスに1つもコンストラクタが定義されていない場合のみ
「引数なし、処理内容なし」のコンストラクタ(デフォルトコンストラクタ)
がコンパイル時に自動的に追加される
同一クラス内の別コンストラクタの呼び出しをJVMに依頼する
this(引数);
まとめに
イメージとして仮想世界で今まで話をしていたけど、実際はコンピュータのメモリ領域
クラス型変数にはインスタンスの情報が格納されているメモリの先頭番地が入っている
⇨別の変数に代入すると、番地情報がコピーされる
コンストラクタはnewによってインスタンス化の直後に自動的に実行されている
かなり難しい内容だなと読んでいて思いました。
クラス型の参照は配列の時と同様に代入で勘違いしてしまうと思うので、アドレスを参照していることをしっかり覚えておきたいです
コンストラクタは読んで何となくわかった...って感じなので繰り返し復習が必要だと感じました
今回もありがとうございました!
ではまた〜 *˙︶˙*)ノ"