カテゴリ: Javaの継承 更新日: 2025/06/07

Java の instanceof 演算子を使ってオブジェクトの型を確認しよう!初心者でもわかる基本と使い方

138
Java の instanceof 演算子を使ってオブジェクトの型を確認しよう

新人と先輩の会話形式で理解しよう

新人

「Javaで変数がどんな型のオブジェクトなのか調べる方法ってありますか?」

先輩

「あるよ!instanceofという演算子を使えば、オブジェクトの型を確認できるんだ。」

新人

「それってどうやって使うんですか?」

先輩

「じゃあ、Javaのinstanceof演算子について、基本から順番に見ていこう!」

1. instanceof演算子ってなに?(基本の説明)

1. instanceof演算子ってなに?(基本の説明)
1. instanceof演算子ってなに?(基本の説明)

Javaのinstanceof演算子は、あるオブジェクトが特定の型(クラスやインターフェース)かどうかを調べるための演算子です。

たとえば、「このオブジェクトはDog型ですか?」といったチェックができます。もしその型ならtrue、そうでなければfalseになります。


public class Animal {}

public class Dog extends Animal {}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog instanceof Dog);    // true
        System.out.println(dog instanceof Animal); // true
    }
}

true
true

DogはAnimalの子クラスなので、両方ともtrueになります。このように、instanceofを使えば、オブジェクトの型を安全に確認できるのです。

2. オブジェクトの型とは?Javaでの意味をやさしく解説

2. オブジェクトの型とは?Javaでの意味をやさしく解説
2. オブジェクトの型とは?Javaでの意味をやさしく解説

Javaでいう「型」とは、あるオブジェクトがどのクラスから作られているかを表すものです。クラスは設計図のようなもので、型はその設計図の名前だと考えるとわかりやすいです。

たとえば、Dog dog = new Dog(); というコードでは、変数dogの型はDogです。

そしてJavaでは、あるクラスが別のクラスを継承していると、親クラスの型でもあるとみなされます。


public class Animal {
    void move() {
        System.out.println("動く");
    }
}

public class Dog extends Animal {
    void bark() {
        System.out.println("ワンワン!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal a = new Dog();
        System.out.println(a instanceof Animal); // true
        System.out.println(a instanceof Dog);    // true
    }
}

true
true

このように、DogのインスタンスをAnimal型の変数で扱っていても、instanceofで本来の型を調べることができます。

Javaのオブジェクトの型とinstanceof演算子は、クラスの関係性を確認したり、型に応じた処理を行いたいときにとても便利です。

3. instanceofを使った具体例(コードと一緒に解説)

3. instanceofを使った具体例(コードと一緒に解説)
3. instanceofを使った具体例(コードと一緒に解説)

Javaのinstanceof演算子は、実際のコードでどう使うのかをしっかり確認しておくことが大切です。ここでは、動物→犬→柴犬というクラス構造を使って、段階的に型を確認していきましょう。


public class Animal {
    void eat() {
        System.out.println("食べます。");
    }
}

public class Dog extends Animal {
    void bark() {
        System.out.println("ワンワン!");
    }
}

public class ShibaInu extends Dog {
    void smile() {
        System.out.println("笑います。");
    }
}

このように、ShibaInuDogの子クラスであり、DogAnimalの子クラスです。では、実際の確認コードを見てみましょう。


public class Main {
    public static void main(String[] args) {
        ShibaInu dog1 = new ShibaInu();

        System.out.println(dog1 instanceof ShibaInu); // true
        System.out.println(dog1 instanceof Dog);      // true
        System.out.println(dog1 instanceof Animal);   // true
    }
}

true
true
true

このように、ShibaInu型のオブジェクトは、Dog型でもあり、Animal型でもあると判断されます。Javaのinstanceof演算子は、このような継承関係にあるクラスをしっかりたどって判断してくれるのです。

4. 親クラスやインターフェースと一緒に使うとどうなる?

4. 親クラスやインターフェースと一緒に使うとどうなる?
4. 親クラスやインターフェースと一緒に使うとどうなる?

Javaのinstanceofは、クラスだけでなく、インターフェースにも使うことができます。インターフェースとは、クラスが「これを使いますよ」と約束する設計図のようなものです。

では、次のような例を見てみましょう。


public interface Pet {
    void play();
}

public class Dog implements Pet {
    public void play() {
        System.out.println("おもちゃで遊びます。");
    }
}

Dogクラスは、Petインターフェースを実装しています。このとき、instanceofはどうなるでしょうか?


public class Main {
    public static void main(String[] args) {
        Dog d = new Dog();

        System.out.println(d instanceof Dog); // true
        System.out.println(d instanceof Pet); // true
    }
}

true
true

このように、インターフェースに対してもinstanceofは使えることがわかります。Javaでは、インターフェースを通じて型のチェックをしたい場面がよくあるので、この機能はとても便利です。

親クラスやインターフェースをまとめて型チェックできるのが、instanceof演算子の強みです。

5. nullとinstanceofの関係は?注意点を学ぼう

5. nullとinstanceofの関係は?注意点を学ぼう
5. nullとinstanceofの関係は?注意点を学ぼう

Javaのinstanceofで、nullを対象に使うとどうなるかも知っておきましょう。

Javaでは、変数に値が入っていないとき(つまりnullのとき)は、instanceofの結果は必ずfalseになります。


public class Animal {}

public class Main {
    public static void main(String[] args) {
        Animal a = null;
        System.out.println(a instanceof Animal); // false
    }
}

false

このように、nullは何の型でもないので、instanceofではfalseになります。

ここで注意したいのは、nullかどうかを確認せずに処理を進めてしまうと、後でエラーになる可能性があるという点です。

そのため、instanceofを使う前にnullチェックをする、もしくはinstanceofを使ってnullも含めて判定するという使い方がよくされます。


if (obj != null && obj instanceof Animal) {
    // objはnullではなく、Animal型のときだけ実行
}

このように書いておけば、安全に型チェックができるようになります。

Javaのinstanceof演算子を使うときは、nullとの関係もセットで覚えておくことがとても大切です。

6. instanceofのよくある使い方(if文と組み合わせ)

6. instanceofのよくある使い方(if文と組み合わせ)
6. instanceofのよくある使い方(if文と組み合わせ)

Javaのinstanceof演算子は、if文と一緒に使うことで、型ごとに処理を分けることができます。これは、たとえば「犬だったら吠える」「猫だったら鳴く」など、型によって動きを変えたいときに便利です。


public class Animal {}

public class Dog extends Animal {
    void bark() {
        System.out.println("ワンワン!");
    }
}

public class Cat extends Animal {
    void meow() {
        System.out.println("ニャー!");
    }
}

このようなクラスがあるとして、実行時にどの動物かを判定して処理を分けたい場合、次のように書けます。


public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(); // Catに変えて試してみよう

        if (animal instanceof Dog) {
            Dog d = (Dog) animal;
            d.bark();
        } else if (animal instanceof Cat) {
            Cat c = (Cat) animal;
            c.meow();
        }
    }
}

ワンワン!

Javaのinstanceofとif文の組み合わせは、多くの種類のオブジェクトを1つの変数で扱いたいときにとてもよく使われます。

これは日常で言えば、「動物」という箱に何が入っているかわからないけど、中身を調べてから「犬ならこうする」「猫ならこうする」と振る舞いを分けるようなイメージです。

7. 初心者がやりがちなミスとその対策

7. 初心者がやりがちなミスとその対策
7. 初心者がやりがちなミスとその対策

Javaのinstanceof演算子は便利ですが、初心者が間違えやすいポイントがいくつかあります。ここではよくあるミスとその対策を紹介します。

① 型変換(キャスト)を忘れる

instanceofで確認したあと、実際にその型のメソッドを使うにはキャストが必要です。たとえば次のような間違いです:


// NGな例
Animal a = new Dog();
if (a instanceof Dog) {
    a.bark(); // コンパイルエラー!
}

これはaAnimal型として扱われているため、bark()が使えず、エラーになります。

正しくは次のようにキャストします:


// OKな例
Animal a = new Dog();
if (a instanceof Dog) {
    Dog d = (Dog) a;
    d.bark();
}

② 関係のない型を判定しようとする

instanceofは、関係のあるクラス・インターフェース同士で使う必要があります。全く関係のない型はコンパイルエラーになります。


String str = "テキスト";
System.out.println(str instanceof Dog); // コンパイルエラー!

このようなときは、型の関係性(継承関係やインターフェース)を事前にしっかり確認することが大切です。

③ nullとの比較を忘れる

前の章でも紹介しましたが、nullに対してinstanceofを使うと、falseになります。nullが入ってくる可能性があるときは、nullチェックも含めて記述しましょう。

8. instanceofを理解するための練習ポイント

8. instanceofを理解するための練習ポイント
8. instanceofを理解するための練習ポイント

Javaのinstanceof演算子をしっかり理解するには、実際にいろいろなパターンで練習するのが一番です。ここでは初心者でもすぐに取り組める練習のポイントをいくつか紹介します。

① 複数のクラスを使った型チェック

動物、車、機械など、全く違うジャンルのクラスを用意して、それぞれに異なる動きをさせてみましょう。

② インターフェースを使ってみる

クラスではなくインターフェースを使って、instanceofで「このオブジェクトはPetインターフェースを実装していますか?」といったチェックをしてみてください。

③ if文で処理を分岐する練習

instanceofifを組み合わせて、「犬だったら吠える」「猫だったら鳴く」「人だったら話す」など、条件によって動作が変わる練習をしてみましょう。


public class Animal {}
public class Dog extends Animal {}
public class Cat extends Animal {}

public class Main {
    public static void main(String[] args) {
        Animal a = new Cat(); // DogにしてみてもOK

        if (a instanceof Dog) {
            System.out.println("これは犬です。");
        } else if (a instanceof Cat) {
            System.out.println("これは猫です。");
        } else {
            System.out.println("よくわからない動物です。");
        }
    }
}

これは猫です。

Javaのinstanceof演算子は、型を安全に調べて、正しい処理に導くための大事な道具です。型の考え方や、クラスのつながりに慣れるためにも、たくさんコードを書いて練習してみてください。

Javaの継承の一覧へ
新着記事
IAM Identity Centerの許可セットとポリシーの関係を解説
IAM Identity Centerの許可セットとポリシーの関係を初心者向けにわかりやすく解説!
Java の正規表現で「数字」や「英字」だけをチェックする方法
Javaの正規表現で「数字」や「英字」だけをチェックする方法を初心者向けに完全解説
Java で正規表現を使う方法(Pattern クラスと Matcher クラス)
Javaで正規表現を使う方法を完全解説!PatternクラスとMatcherクラスを初心者向けにやさしく説明
FlutterでQRコードの生成・読み取りをする方法
FlutterでQRコードの生成・読み取りを実装する方法!初心者でもできるQRアプリ開発
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説