スッキリわかるJava入門 第9章 さまざまなクラス機構①
第9章 さまざまなクラス機構①
仮想世界の真の姿
クラス型変数とその中身
public class Main{ public static void main(String[] args) { Hero h; h = new Hero(); h.hp = 100; } }
Step1:Hero型変数の確保
Step2:インスタンスの生成
- 4行目「h = new Hero();」は代入文。代入の場合は左辺より先に右辺が評価される。
- 「new Hero()」が実行されると、JVMはヒープ領域から必要な量のメモリを確保する。
- 仮に3299番地から24バイト分(3299~3945番地)が確保されたとする。
Step3:参照の代入
- 右辺の実行が終了した後、4行目は「h = 右辺の実行結果」という状態になる。
- 右辺の実行結果とは、newを実行することによって生成されたインスタンスのために確保されたメモリの先頭番地。
- 変数hには3299という数字が代入される。変数hに入っているアドレス情報を参照と言う。(配列型と同じ)
- クラス型と配列型は総称して「参照型」と呼ばれる。
同一インスタンスを指す変数
public class Main { public static void main(String[] args) { Hero h1; h1 = new Hero(); h1.hp = 100; Hero h2; h2 = h1; h2.hp = 200; System.out.println(h1.hp); } }
クラス型をフィールドに用いる
// まず、Swordクラスを定義しておく public class Sword { String name; int damage; }
// 次にHeroクラスを定義する public class Hero { String name; int hp; Sword sword; public void attack() { System.out.println(this.name + "は攻撃した!"); System.out.println("敵に5ポイントのダメージをあたえた!"); } }
- Heroクラスの5行目「Sword sword」。このようにフィールドにクラス型を使っても問題ない。
- あるクラスが別のクラスをフィールドとして利用している関係を「has-aの関係」と言う。
- Hero has-a Sword(勇者は剣を持っている)
public class Main { public static void main(String[] args) { Sword s = new Sword(); s.name = "炎の剣"; s.damage = 10; Hero h = new Hero(); h.name = "ミナト"; h.hp = 100; h.sword = s; System.out.println("現在の武器は" + h.sword.name); } }
- 3行目「Sword s = new Sword()」でswordフィールドに生成済みの剣インスタンスの番地を、9行目「h.sword = s」で代入。
- 10行目の「h.sword.name」は、勇者「の」剣「の」名前を出力する。
クラス型をメソッド引数や戻り値に用いる
- クラス型はフィールドの型として用いることができるだけではなく、メソッドの引数や戻り値の型として利用することもできる。