本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第4章 多態性 ― 同じ呼び方で、違う動きをする · レッスン14

instanceof ― 実際の型を確認する

ブラウザで完結

導入

親の型でまとめて扱うのは便利ですが、「これは実は 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 を追加してください(中身は空でよい)。mainAnimal[] animals = { new Dog(), new Bird() }; を作り、instanceofDog なら これは犬ですBird なら これは鳥です と表示してください。

ヒント1を見る

class Bird extends Animal {} を追加します。

ヒント2を見る

if (a instanceof Dog) { ... } else if (a instanceof Bird) { ... } の順で判定します。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。