JAVA instanceof 演算子(ダウンキャストによるエラーを確実に回避する方法)

▪️安全にキャスト出来るかを判断する
**変数 instanceof 型名**
※変数を型名の箱に代入可能ならtrueが返る。
インスタンスを代入可能かどうかチェックする。
ダウンキャストによるClassCastExceptionを確実に回避するには、
キャストする前に「キャストしても大丈夫かどうか」をチェックします。
Javaにはそのためのinstanceof 演算子が用意されています。

```java
if (ccc instanceof Wizard) {
もしcccの中身がWizardと見なして大丈夫なら・・・
			Wizard www = (Wizard) ccc;
「Wizard」とみなせ！
			www.fireball(m2);
		}
```

■Wizard.java

```java
public class Wizard extends Character {
	int mp;

	public Wizard(String name, int hp) {
		super(name, hp);
	}

	public void attack(Matango2 m) {
		System.out.println(this.name + "の攻撃!");
		System.out.println("敵に3ポイントのダメージ");
		m.hp -= 3;
	}

	public void fireball(Matango2 m) {
		System.out.println(this.name + "は火の玉を放った!");
		System.out.println("敵に20ポイントのダメージ");
		m.hp -= 20;
		this.mp -= 5;
	}

}
```

■Character.java

```java
public abstract class Character {
	String name;
	int hp;

	public Character(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	Character() {
		// this("ダミー");
		System.out.println("Hero2のコンストラクタが動作");
	}

	public String getName() {
		return this.name;
	}

	public int getHp() {
		return this.hp;
	}

	public void run() {
		System.out.println(this.name + "は逃げ出した");
	}

	public abstract void attack(Matango2 m1);

}
```

■Main23.java

```java
public class Main23 {
	public static void main(String[] args) {
		
		Wizard wz6 = new Wizard("魔女6", 15);

		// キャラクター
		Character aa = new Wizard("魔女7", 21);
		Wizard ccc = (Wizard) aa; //ダウンキャストでエラー
		ccc.fireball(m2);
		// Hero h = (Hero) aa; エラーになる
		if (aa instanceof Wizard) {

			Wizard www = (Wizard) aa;
			www.fireball(m2);
		}
		ccc.fireball(m2);
	}
}
```

■実行結果
魔女7は火の玉を放った!
敵に20ポイントのダメージ
魔女7は火の玉を放った!
敵に20ポイントのダメージ
魔女7は火の玉を放った!
敵に20ポイントのダメージ

<FONT color="#ff0000">
例②-----------------------------------------------------------------------------------------------------------------------------</FONT>
■Character.java

```java
public abstract class Character {
	String name;
	int hp;

	public Character(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}

	Character() {
		// this("ダミー");
		System.out.println("Hero2のコンストラクタが動作");
	}

	public String getName() {
		return this.name;
	}

	public int getHp() {
		return this.hp;
	}

	public void run() {
		System.out.println(this.name + "は逃げ出した");
	}

	public abstract void attack(Matango2 m1);

	// public abstract void read(Matango2 m1);

}
```

■Dancer.java

```java
public class Dancer extends Character {

	private String name;

	Dancer(String name) {
		this.name = name;
	}

	public String getName() {
		return this.name;
	}

	public void dance() {
		System.out.println(this.name + "は情熱的に踊った");
	}

	public void attack(Matango2 m1) {
		System.out.println(this.name + "の攻撃");
		System.out.println("敵に3ポイントのダメージ");
		m1.hp -= 3;
	}

	public void read(Matango2 m1) {
		System.out.println(this.name + "は読んだ");
		m1.hp += 2;
	}

}
```

■Main23.java

```java
public class Main23 {
	public static void main(String[] args) {

		// ダンサー
		Character jjj = new Dancer("ダンサー5");
		Dancer ppp = (Dancer) jjj; // ダウンキャストでエラー

		if (jjj instanceof Dancer) {

			Dancer fff = (Dancer) jjj;
			fff.read(m2);
		}

		ppp.read(m2);
	}
}
```

■実行結果
ダンサー5は読んだ
ダンサー5は読んだ