has-aの関係
フィールドにクラス型の変数を宣言する
あるクラスが別のクラスをフィールドとして利用している関係
Sword.java
public class Sword
String name; // 剣の名前
int damage; //
Hero.java
public class Hero {
String name;
int hp;
Sword sword; // 勇者が装備している剣の情報
public void attack() {
System.out.println(this.name + "は攻撃した!");
System.out.println("敵に5ポイントのダメージをあたえた!");
}
}
Heroクラスに新しく追加されたフィールド「Sword」は、int型やStirng型ではなくSword型
フィールドにクラス型の変数を宣言ができる
Hero has-a Sword(勇者は剣を持っている)
Main.java
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; // swordフィールドに生成済みの剣インスタンス(番地)を代入
System.out.println("現在の武器は" + h.sword.name); // 勇者「の」剣「の」名前
}
}
結果.
現在の武器は炎の剣
クラス型をメソッド引数や戻り値に用いる
クラス型はフィールドの型に用いるだけではなく、メソッドの引数や戻り値にも利用できる
Wizard.java
public class Wizard {
String name;
int hp;
public void heal(Hero h) { // 引数はHero型
h.hp += 10; // 勇者のHPに10を加える
System.out.println(this.name + "が" +h.name + "のHPを10回復した");
System.out.println(h.name + "のHPが" + h.hp + "になった");
}
}
Hero.java
public class Hero{
String name;
int hp;
}
healメソッドが呼び出されると、魔法使いインスタンスは勇者のHPを10回復させる。呼び出されるときに「どの勇者を回復するのか」を引数hとして受け取る必要がある
Main.java
public class Main {
public static void main(String[] args) {
Hero h1 = new Hero();
h1.name = "ミナト";
h1.hp = 100;
Hero h2 = new Hero();
h2.name = "アサカ";
h2.hp = 100;
Wizard w = new Wizard();
w.name = "スガワラ";
w.hp = 50;
w.heal(h1);
w.heal(h2);
}
}
スガワラがミナトのHPを10回復した
ミナトのHPが110になった
スガワラがアサカのHPを10回復した
アサカのHPが110になった
参考にした本↓↓ わかりやすいです