言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Java辞典

  1. トップページ
  2. Java辞典
  3. Objects.toString() / getClass() / instanceof

Objects.toString() / getClass() / instanceof

対応: Java 1.0(1996)

オブジェクトの実際の型を実行時に確認するための演算子・メソッドです。『instanceof』で型チェックを行い、『getClass()』で実際のクラスを取得します。Java 16以降はパターンマッチングでキャストを簡略化できます。

構文

// instanceofで型を確認します(trueなら指定型またはそのサブクラス)。
boolean result = オブジェクト instanceof 型名;

// パターンマッチング instanceof(Java 16以降): チェックとキャストを同時に行います。
if (オブジェクト instanceof 型名 変数名) {
    // 変数名を型名として直接使用できます。
}

// 実際のクラスオブジェクトを取得します。
Class<?> clazz = オブジェクト.getClass();

// クラスの単純名(パッケージなし)を取得します。
String simpleName = オブジェクト.getClass().getSimpleName();

// クラスの完全修飾名を取得します。
String fullName = オブジェクト.getClass().getName();

メソッド・演算子一覧

メソッド / 演算子概要
instanceof 型名オブジェクトが指定した型またはそのサブクラスのインスタンスであれば true を返します。null に対しては常に false を返します。
instanceof 型名 変数名Java 16以降のパターンマッチング。条件が真の場合に変数に自動キャストされた値を束縛します。
getClass()実行時の実際のクラスを Class<?> オブジェクトとして返します。
getClass().getSimpleName()クラスの単純名(パッケージ部分を除いた名前)を返します。
getClass().getName()完全修飾クラス名(例: java.lang.String)を返します。
getClass().getSuperclass()直接の親クラスを返します。
getClass().getInterfaces()実装しているインターフェースの配列を返します。

サンプルコード

sample_GetclassInstanceof.java
class Fighter {}
class KofFighter extends Fighter {}
class OrocFighter extends Fighter {}

class GetclassInstanceof {
    public static void main(String[] args) {
        // instanceofで型チェックを行います。
        Object obj = "八神庵";
        System.out.println(obj instanceof String);  // 『true』と出力されます。
        System.out.println(obj instanceof Integer); // 『false』と出力されます。
        System.out.println(null instanceof String); // 『false』と出力されます(nullはfalse)。

        // 従来のinstanceof + キャストの書き方です。
        if (obj instanceof String) {
            String s = (String) obj;
            System.out.println(s.toUpperCase()); // 『八神庵』と出力されます。
        }

        // パターンマッチングinstanceof(Java 16以降)。
        if (obj instanceof String s) {
            System.out.println(s.length()); // 『3』と出力されます。
        }

        // getClass() でクラス情報を取得します。
        Object num = 42;
        System.out.println(num.getClass().getSimpleName()); // 『Integer』と出力されます。
        System.out.println(num.getClass().getName());        // 『java.lang.Integer』と出力されます。

        // ポリモーフィズムとinstanceofを組み合わせます。
        Fighter a = new KofFighter();
        System.out.println(a instanceof Fighter);    // 『true』と出力されます。
        System.out.println(a instanceof KofFighter); // 『true』と出力されます。
        System.out.println(a instanceof OrocFighter); // 『false』と出力されます。

        // switch文でパターンマッチング(Java 21以降)。
        Object value = 3.14;
        String desc = switch (value) {
            case Integer i -> "整数: " + i;
            case Double d  -> "小数: " + d;
            case String s  -> "文字列: " + s;
            default        -> "その他";
        };
        System.out.println(desc); // 『小数: 3.14』と出力されます。
    }
}
javac GetclassInstanceof.java
java GetclassInstanceof
true
false
false
八神庵
3
Integer
java.lang.Integer
true
true
false
小数: 3.14

概要

『instanceof』はポリモーフィズムを使ったコードでオブジェクトの実際の型を確認するときに使います。Java 16以降のパターンマッチング構文(instanceof 型名 変数名)を使うと、チェックとキャストを1行で書けて可読性が上がります。

『getClass()』は継承関係を無視して実際のクラスだけを返します。継承を考慮した型チェックには instanceof を使い、厳密に同じクラスかどうかを確認したい場合は getClass() == 型名.class を使ってください。

Objectsクラスのユーティリティメソッドについては『Objects.equals() / Objects.toString() / Objects.requireNonNull()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。