導入
親の型でまとめて扱うのは便利ですが、「これは実は Dog だから Dog 専用の処理をしたい」という場面もあります。そんなときは instanceof で、変数に入っている実体の型を確認できます。
説明
変数 instanceof クラス名 は、変数の中身が指定したクラス(またはそのサブクラス)のインスタンスかどうかを true/false で返します。
public class Main {
public static void main(String[] args) {
Animal[] animals = { new Dog(), new Cat() };
for (Animal a : animals) {
if (a instanceof Dog) {
System.out.println("これは犬です");
} else if (a instanceof Cat) {
System.out.println("これは猫です");
}
}
}
}
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
Animal 型の変数 a に入っている実体が Dog かどうかを a instanceof Dog で判定しています。これにより、親の型で受け取りつつ「本当は何者か」を確認できます。
やってみよう
下のエディタで配列の中身を入れ替えて実行し、instanceof の判定結果が実体に応じて変わることを確認しましょう。
演習
Bird extends Animal を追加してください(中身は空でよい)。main で Animal[] animals = { new Dog(), new Bird() }; を作り、instanceof で Dog なら これは犬です、Bird なら これは鳥です と表示してください。
ヒント1を見る
class Bird extends Animal {} を追加します。
ヒント2を見る
if (a instanceof Dog) { ... } else if (a instanceof Bird) { ... } の順で判定します。