【Java入門】instanceof演算子で型を判定(クラス/インターフェース)

こんにちは!システムエンジニアのオオイシです。

Javaにはその変数は◯◯クラスのインスタンスか?を判定するときに便利なinstanceof演算子があります。この記事では

instanceof演算子とは?
instanceof演算子の使い方を知りたい
データ型を判定する方法を教えて欲しい

というinstanceof演算子の基本的な解説から

  • サブクラスがスーパークラスを継承しているかを判定する方法
  • インターフェースを実装しているかを判定する方法
  • instanceof演算子で左辺がnullの場合

についても解説していきます。今回はそんなinstanceof演算子の使い方についてわかりやすく解説します!

instanceof演算子とは

instanceof演算子とは、

  • ◯◯クラスのインスタンスか?
  • ◯◯クラスのサブクラスのインスタンスか?
  • ◯◯インターフェース実装したクラスのインスタンスか?
  • ◯◯インターフェース実装したサブクラスのインスタンスか?

を判定します。instanceof演算子は次のように記述します。

書き方:

変数名 instanceof クラス名
変数名 instanceof インターフェース名

戻り値はtrueかfalseを返します。trueを返す条件は、

  • 変数がinstanceofの右辺で指定したクラスのインスタンスである
  • 変数がinstanceofの右辺で指定したインターフェースを実装したクラスのインスタンスである

の2点です。注意してほしいのは、instanceof演算子が使えるのは参照型の変数のみであるということです。つまり、int型やboolean型などのプリミティブ型には使えません

使用した場合には、コンパイルエラーになります。なぜならばinstanceofの名前が表すとおり○○クラスのインスタンスか?を判定するための演算子だからです。プリミティブ型はインスタンスを作成できないためinstanceof演算子は使えないと覚えておいてください。

instanceof演算子の実践的な使い方としては、例えば、if文を使ってこの変数は○○クラスへダウンキャスト可能か?を判定するときなどに利用します。

ダウンキャストとは、サブクラスへ型変換することで、ダウンキャストができない場合には「java.lang.ClassCastException」という例外が発生します。

そのため、ダウンキャストができるかどうかを事前にチェックするときに使用します。キャストについては、こちらで詳しく説明していますので、ぜひ参考にしてください。

【Java入門】キャスト(型変換)とアップキャスト、ダウンキャスト
更新日 : 2019年5月30日

instanceof演算子の使い方

ここではサンプルコードを交えてinstanceof演算子の使い方を解説します。

データ型を判定する方法

instanceof演算子はその変数は◯◯クラスのインスタンスか?を判定するときに使用します。instanceof演算子を使用して、Object型の変数がStringクラスのインスタンスであるかを判定する方法を次のプログラムで確認しましょう。

public class Main {
    public static void main(String[] args) {

        Object obj = "samurai";
        System.out.println(obj instanceof String);
        System.out.println(obj instanceof Integer);
    }
}

実行結果:

true
false

変数objはStringクラスのインスタンスですが、Integerクラスのインスタンスではないことが確認できました。もう1点、実践的な例としてStringクラスへダウンキャストが可能な場合はキャスト処理をするサンプルコードを紹介します。

public class Main {
	public static void main(String[] args) {

		Object obj = "samurai";

		if (obj instanceof String) {
			String str = (String) obj; // Object型をString型へキャスト
			System.out.println("変数objの値は「" + str + "」です。");
		} else {
			System.out.println("変数objはString以外の型です。");
		}
	}
}

実行結果:

変数objの値は「samurai」です。

このサンプルコードは、変数objの型が何なのかわからないので、String型にキャストできるかをinstanceof演算子で確認してからキャストしています。

サブクラスがスーパークラスを継承しているかを判定する方法

instanceof演算子を使って、サブクラスがスーパークラスを継承しているのかどうかを判定することができます。

java_instanceof_1

画像:サブクラスとスーパークラスの継承についての解説図

instanceof演算子で指定するクラスが、サブクラスとスーパークラスどちらでもtrueが返ります。サンプルコードで確認してみましょう。

public class Main {
    public static void main(String[] args) {

        SubClass sub = new SubClass();
        System.out.println(sub instanceof SubClass);
        System.out.println(sub instanceof SuperClass);
    }
}

class SuperClass {}
class SubClass extends SuperClass{}

実行結果:

true
true

このプログラムでは、変数subが指定したスーパークラスのサブクラスのインスタンスかどうかを判定しています。このようにして、サブクラスがスーパークラスを継承しているかを判定することができました。

なお、クラスの継承方法の詳細については、こちらの記事で詳しく解説しているので、ぜひ確認してみてください。

今からでも遅くない!クラスの継承(extends)を学ぼう!【Java】
更新日 : 2018年10月26日

インターフェースを実装しているかを判定する方法

instanceof演算子を使って、インターフェースを実装しているのかどうかを判定することができます。

java_instanceof_2

画像:インターフェースの実装判定についての解説図

instanceof演算子を使うには次のように

変数名 instanceof インターフェース名

と記述しましょう。instanceof演算子を使って、インターフェースを実装しているのかどうかを判定する方法を、次のサンプルコードで確認してみましょう。

public class Main {
    public static void main(String[] args) {

        SubClass sub = new SubClass();
        System.out.println(sub instanceof SubClass);
        System.out.println(sub instanceof Interface);
    }
}

interface Interface {}
class SuperClass implements Interface {}
class SubClass extends SuperClass {}

実行結果:

true
true

このプログラムでは、変数subが指定したインターフェースを実装したクラスのインスタンスであるかどうかを判定しています。このようにして、インタフェースを実装しているのかどうかを判定することができました。

インターフェース詳細については、こちらの記事で詳しく解説しているので、ぜひ確認してみてください。

instanceof演算子で左辺がnullの場合

instanceof演算子左辺がnullの場合はどのように判定されるでしょうか?nullを参照する変数はインスタンスを参照していないという状態です。そのため、instanceof演算子で左辺がnullの場合は、結果が常にfalseになります。

サンプルコードで確認してみましょう

public class Main {
    public static void main(String[] args) {

        String str = null;
        System.out.println(str instanceof Object);
    }
}

実行結果:

false

このサンプルコードでは、null が Objectクラスのインスタンスであるかどうかを判定しています。Objectクラスは全てのクラスの親クラスであるため、instanceof演算子を使った場合に通常はすべてtrueを返します。ただし、左辺がnullの場合にはfalseを返します。

まとめ

いかかでしたか?
今回はinstanceof演算子の使い方について説明しました。instanceof演算子は、

  • その変数は◯◯クラスのインスタンスか?
  • その変数は◯◯インターフェースを実装したのインスタンスか?

を判定するために使用します。instanceof演算子は、インスタンス変数のクラスによって処理を切り替えたい場合に有効ですのでぜひ活用してみてください。

もし、instanceof演算子の使い方を忘れてしまったらこの記事を確認してください!

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

オオイシ

オオイシ

システムエンジニア歴15年のオオイシです!好物は Java と Ruby。プログラミング、システムアーキテクトからマネジメントに到るまでなんでも食べます。
システム開発の相談やお困りごとがあればお気軽に
[email protected] まで連絡頂けると幸いです

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説