授業ノートのまとめ
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
android stadio
SDKがみつからない
→保留で!
多態性の続き
p508
wizard,Main509をつくる
--->Main512.java
public class Main512 {
public static void main(String[] args) {
Slime s = new Slime();
Monster m = new Slime();
s.run();
m.run();
}
}
--->Monster.java
public abstract class Monster {
public void run() {
System.out.println("モンスターは逃げ出した");
}
}
--->Slime.java
public class Slime extends Monster{
public void run() {//override
System.out.println("スライムはぴょんぴょん逃げ出した");
}
}
最初ばってんがMainのMonster m = new Slime();部分についたが、
①Monster.javaのabstractが抜けていた
②Slime.javaのextends Monsterが抜けていた
実行結果
スライムはぴょんぴょん逃げ出した
スライムはぴょんぴょん逃げ出した
箱の型:どのメソッドを呼べるか
中身の型:メソッドが呼ばれたらどう動くか
奥の手が「キャスト」
キャスト? 聞いたことあるな?
あまり手段としてはよろしくないらしい
--->Main517.java
public class Main517 {
public static void main(String[] args) {
Character c = new SuperHero();
//Character c = new Wizard();
if(c instanceof SuperHero) {//trueのときのみキャスト
SuperHero sh=(SuperHero) c;//キャスト
System.out.println("c is SuperHero ins.");
sh.fly();
}else {
System.out.println("c is not SuperHero ins.");
}
}
}
多態性のメリット
スライム、ゴブリン、蝙蝠を配列Monsterにぶちこんでfor文でまとめて攻撃できる
ところでHeroにエラーが出るようになりますね。
エラーが出るHero.java--->
public class Hero extends Character{
String name = "ミナト";
int hp = 100;
public void attack(Monster m){
System.out.println(this.name + "の攻撃!");
System.out.println("10ポイントのダメージをあたえた!");
m.hp -= 5;
}
public void run() {
System.out.println(this.name + "は逃げ出した!");
}
public final void slip(){ /* finalがついているslip()メソッドは子クラスでオーバーライド禁止 */
this.hp -= 5;
System.out.println(this.name + "は転んだ!");
System.out.println("5のダメージ");
}
public int getHp() {
return this.hp;
}
public void setHp(int hp) {
this.hp = hp;
System.out.println("Heroポイント" + hp);
}
}
エラー2件ですね。
どう解決する??
ヒント:直すのはHeroではない
→
Character.javaのここを修正
→
public abstract void attack(Monster m);
Monster.javaの
→
int hp;
さて配列をfor文でぶん回して敵を一掃しますよ
--->Main523.java
public class Main523 {
public static void main(String[] args) {
Monster[] monsters = new Monster[3];
monsters[0] = new Slime();
monsters[1] = new Goblin();
monsters[2] = new DeathBat();
for(Monster m : monsters) {
m.run();
}
}
}
--->出力結果
スライムはぴょんぴょん逃げ出した
ゴブリンはだだだと逃げ出した
蝙蝠は逃げ出した
これが「ゆるく定義」することのメリット。
呼び出す側はざっくりMonsterというくくりで呼び出し、
呼び出された側はそれぞれの種族による逃げ方で逃げるという動作をしている