忍者ブログ

からすまる日誌

2020011603 swordやwizard

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2020011603 swordやwizard

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="ダミー";
 }
}
 
PR

コメント

ブログ内検索

カレンダー

03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30