instanceof演算子
instanceof 演算子は、オブジェクトが指定したクラスまたはそのサブクラスのオブジェクトであるかどうかを調べるために使用する演算子です。主にダウンキャストを行う前に、変換できるオブジェクトかどうかを確認するために使用されます。ここではオブジェクト指向における instanceof 演算子の使用方法について解説します。
instanceof演算子とは
instanceof 演算子は、オブジェクトが指定したクラスのオブジェクトであるかどうかを確認し、その結果を boolean 型の値で返す演算子です。オブジェクトが特定のクラスのオブジェクトであるか、またはそのクラスを継承したサブクラスのオブジェクトである場合に true を返し、そうでない場合は false を返します。
書式は次の通りです。
オブジェクト instanceof クラス名
次の例では Foods クラスのオブジェクトを作成し、Foods 型の変数 f に代入しています。
class Product {
}
class Foods extends Product {
}
public class Sample {
public static void main(String[] args) {
Foods f = new Foods();
System.out.println(f instanceof Foods);
System.out.println(f instanceof Product);
}
}
作成したオブジェクトは Foods クラスのオブジェクトです。また Foods クラスは Product クラスのサブクラスなので、instanceof 演算子を使って調べるとどちらも true となります。
true true
今度は Product クラスのオブジェクトを作成し、Product 型の変数 p に代入しています。(クラス定義の部分は同じです)。
public class Sample {
public static void main(String[] args) {
Product p = new Product();
System.out.println(p instanceof Foods);
System.out.println(p instanceof Product);
}
}
作成したオブジェクトは Product クラスのオブジェクトです。Product クラスは Foods クラスのサブクラスではないため、instanceof 演算子を使って調べると最初は false、次は true となります。
false true
最後に Foods クラスのオブジェクトを作成し、Product 型の変数 p に代入しています。(クラス定義の部分は同じです)。このようにサブクラスのオブジェクトをスーパークラス型の変数に代入することをアップキャストといいます。
public class Sample {
public static void main(String[] args) {
Product p = new Foods();
System.out.println(p instanceof Foods);
System.out.println(p instanceof Product);
}
}
変数 p の型は Product 型ですが、実際に作成したオブジェクトは Foods クラスのオブジェクトです。Foods クラスは Product クラスのサブクラスなので、instanceof 演算子を使って調べるとどちらも true となります。
true true
ダウンキャストとinstanceof
アップキャストとは逆に、スーパークラス型の変数をサブクラス型に変換することをダウンキャストといいます。ダウンキャストを行うことで、サブクラスでのみ定義されているメソッドを呼び出すことができるようになります。
ダウンキャストを行う場合、実際に参照しているオブジェクトがそのクラスのオブジェクトである必要があります。もし異なるクラスのオブジェクトをダウンキャストすると、実行時エラーが発生します。そこで instanceof 演算子を利用して、ダウンキャストを行う前にオブジェクトの種類を確認します。
class Product {
}
class Foods extends Product {
}
public class Sample {
public static void main(String[] args) {
Product p = new Foods();
if (p instanceof Foods) {
Foods f = (Foods)p; // ダウンキャスト
}
}
}
変数 p の型は Product 型ですが、作成したオブジェクトは Foods クラスのオブジェクトです。そのため、if 文の条件式に記述している instanceof 演算子は true を返し、if 文のブロック内の処理が実行されてダウンキャストが行われます。
このように instanceof を使用して確認してからダウンキャストを行うことで、実行時エラーを防ぐことができます。
-- --
オブジェクト指向における instanceof 演算子の使用方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。