p340
孫クラスみたいになってるってこと?
Swordというクラスを作っとく
HeroではそのSword型の剣の設定をする
MainがHeroをnewする
int hp;のように
Sword swordになっているだけ
大文字のSwordは「そういう型」ですよ
ちなみにこれを入力するとき、
互いが連携しているせいか、
途中でdamageをdamegeとスペルミスしたら
3つのjavaに全部ばってんがついたよ
--->Main343.java
public class Main343 {
public static void main(String[] args) {
Hero h1 = new Hero();
h1.name="みなと";
h1.hp = 100;
Hero h2 = new Hero();
h2.name ="あさか";
h2.hp=21000000;
Wizard w =new Wizard();
w.name="すがわら";
w.hp=50;
w.heal(h1,w);//みなとを回復
w.heal(h2,w);//浅香を回復
w.heal(h2,w);//浅香を回復
}
}
--->Wizard.java
public class Wizard {
String name;
int hp;
void heal(Hero h,Wizard w) {
h.hp+=10;
System.out.println(w.name+"はhealをつかった!");
System.out.println(h.name+"のhpを10回復");
System.out.println(h.name+"のhpは"+h.hp);
}
}
これですね、はじめ記述を勝手に足してみたらエラーが出た。
引数をvoid heal(Hero h)から
void heal(Hero h,Wizard w) {
に変えて、
呼び出し元も
w.heal(h1,w);//みなとを回復
としたら通りましたね。
引数の型と数は一致してないとなんですね
String s = new String("こんにちは");
これが本来ホントの書き方だが、
あまりによく使う。
ので、
String s="こんにちは";
でも、
「ストリング型の変数sをnewして中身は"こんにちは"」という意味に『特例で』javaが判断している
逆にString s = new String("こんにちは");とか書く人はいないよ
newしたら自動的に値を代入させておくのが大事らしい
--->Hero.java
public class Hero {
String name;
int hp;
Sword sword;
Hero(){
this.hp=100;
}
void attack() {
System.out.println(this.name+"の攻撃!");
System.out.println("敵に5ポイントのダメージ");
}
}
--->Main343.java
public class Main343 {
public static void main(String[] args) {
Hero h1 = new Hero();
h1.name="みなと";
//h1.hp = 100;
Hero h2 = new Hero();
h2.name ="あさか";
//h2.hp=21000000;
Wizard w =new Wizard();
w.name="すがわら";
w.hp=50;
w.heal(h1,w);//みなとを回復
w.heal(h2,w);//浅香を回復
w.heal(h2,w);//浅香を回復
}
}
→Mainでhpを指定する必要がなくなった
こういう、 Hero(){
this.hp=100;
}
を
コンストラクタという
クラス名(public class Hero {)とまったく同じメソッド名、リターン値なし(voidやintをつけない)。
特殊なメソッド。
Heroがnewされたとき(インスタンスが生成されたとき))に自動で実行される
ゆうしゃの名前に関してはこの方法で設定してしまうと全部hpが100になるように名前がぜんぶおなじになってしまうのはまずい
①さっきのコンストラクタに「引数をもらう」ようにしてやる
Hero(String name){
this.hp=100;
this.name=name;
}
②Mainも修正
public class Main343 {
public static void main(String[] args) {
Hero h1 = new Hero("みなと");
//h1.name="みなと";
//h1.hp = 100;
Hero h2 = new Hero("asaka");
//h2.name ="あさか";
//h2.hp=21000000;
System.out.println(h1.hp);
System.out.println(h1.name);
System.out.println(h2.hp);
System.out.println(h2.name);
}
}
勇者の名前は生成時に「引数」で渡してやる
Heroを生成するクラスの方ではそれを受け取り、自分自身の名前はそれにする
というシステム
thisをつける意味はここにある
引数のnameと自分のフィールドのnameを区別するために
多重定義
しかしいまHeroをnewするときに「必ず名前を引数で送れよ」という設定になってしまった
あさかさん曰くめんどい。
→
「引数があるときのHeroとないときのHeroを作っておく(多重定義)、引数があったらその引数の名前で勇者をつくれ、引数がなかったらこっちできめた「ダミー」という名前でつくるよー」という
public class Hero {
String name;
int hp;
Sword sword;
Hero(String name){
this.hp=100;
this.name=name;
}
Hero(){
this.hp=100;
this.name="ダミー";
}
}