教本に沿ってやってみたシリーズ、『第9章』です。
≪使用教材≫スッキリわかるJava入門 第3版 スッキリわかるシリーズ
インスタンスとクラス機構
- ヒープ
プログラムを実行する際にJVMが準備する大量のメモリ領域のこと。インスタンスの情報を格納するためのもの。必要とする容量に従って大きくなる。
public class Main {
public static void main(String[] args) {
Hero h; //Hero型の変数hをメモリ内に用意
h = new Hero(); //1、Heroインスタンスを生成
//2、インスタンスが生成されたメモリの先頭番地がhに代入される(参照)
h.hp = 100; //hに格納されているhpに100を代入(アドレス解決)
-
インスタンスの独立性
同じクラスから生まれた異なるインスタンス(例…h1,h2)が互いに影響しあわないこと。 -
has-aの関係
あるクラスが別のクラスをフィールドとして利用している関係。
public class Sword { //武器クラス
String name;
int damege;
}
public class Hero { //武器を所持した勇者のクラス
String name;
int hp;
Sword sword;
public void attack(){…}
}
public class Main {
public static void main(String[] args){
Sword s= new Sword();
s.name = "勇者の剣"
s.damege = 30;
Hero h = new Hero();
h.name = "ヤマト";
h.hp = 100;
h.sword = s; //武器クラスに生成済みの武器インスタンスを代入;
System.out.println("現在の武器は"+ h.sword.name); //勇者の剣の名前が表示される
}
- コンストラクタ
newされた直後に自動的に実行されるメソッド。
Heroクラスに定義されたコンストラクタにより、mainメソッド側での初期値代入が不要になる。下記のようにメソッド名がクラス名と等しく、メソッド宣言にvoidを含む戻り値の型が記述されていないメソッドが、コンストラクタと認識される。
public Hero(String name){ //引数で文字列を受け取る(newするときに渡す)
this.hp = 100; //newした際に初期値として100が代入される
this.name = name; //引数の値でnameを初期化
}
- デフォルトコンストラクタ
Javaでは、「すべてのクラスは最低でも1つ以上のコンストラクタ定義をもっていなければならない」というルールが存在するが、1つもコンストラクタが定義されていない場合に限って「引数なし、処理内容なし」のコンストラクタが自動的に追加される。これをデフォルトコンストラクタという。
例えば複数コンストラクタがある場合、同一の内容を繰り返し呼び出すには、thisを使用する。
public Hero(String name){ //コンストラクタ①
this.hp = 100;
this.name = name;
}
public Hero(){ // コンストラクタ②(①を呼び出している)
this("ダミー");
}
次回、継承について。