logo

Java インスタンス

  1. Javaインスタンス
  2. インスタンスオブ演算子の例
  3. null 値を持つ変数にinstanceof演算子を適用する
  4. instanceof 演算子を使用したダウンキャスト
  5. instanceof 演算子を使用しないダウンキャスト

Javaのinstanceof演算子 オブジェクトが指定された型 (クラス、サブクラス、またはインターフェイス) のインスタンスであるかどうかをテストするために使用されます。

Javaのinstanceofはtypeとも呼ばれます。 比較演算子 インスタンスと型を比較す​​るためです。 true または false を返します。 null 値を持つ変数に instanceof 演算子を適用すると、false が返されます。

Javaのinstanceofの簡単な例

現在のクラスをテストするインスタンス オペレーターの簡単な例を見てみましょう。

 class Simple1{ public static void main(String args[]){ Simple1 s=new Simple1(); System.out.println(s instanceof Simple1);//true } } 
今すぐテストしてください
 Output:true 

サブクラス型のオブジェクトは、親クラスの型でもあります。たとえば、Dog が Animal を拡張した場合、Dog のオブジェクトは Dog クラスまたは Animal クラスのいずれかで参照できます。

Javaのinstanceof演算子の別の例

 class Animal{} class Dog1 extends Animal{//Dog inherits Animal public static void main(String args[]){ Dog1 d=new Dog1(); System.out.println(d instanceof Animal);//true } } 
今すぐテストしてください
 Output:true 

null値を持つ変数を含むJavaのinstanceof

null 値を持つ変数にinstanceof演算子を適用すると、falseが返されます。 null 値を持つ変数にinstanceof演算子を適用する以下の例を見てみましょう。

 class Dog2{ public static void main(String args[]){ Dog2 d=null; System.out.println(d instanceof Dog2);//false } } 
今すぐテストしてください
 Output:false 

Javaのinstanceof演算子を使用したダウンキャスト

サブクラス型が親クラスのオブジェクトを参照することは、ダウンキャストとして知られています。直接実行するとコンパイラでコンパイルエラーが発生します。型キャストで実行すると、実行時に ClassCastException がスローされます。しかし、instanceof 演算子を使用すると、ダウンキャストが可能になります。

 Dog d=new Animal();//Compilation error 

型キャストによってダウンキャストを実行すると、実行時に ClassCastException がスローされます。

 Dog d=(Dog)new Animal(); //Compiles successfully but ClassCastException is thrown at runtime 

instanceofによるダウンキャストの可能性

ダウンキャストがinstanceof演算子によって可能である例を見てみましょう。

 class Animal { } class Dog3 extends Animal { static void method(Animal a) { if(a instanceof Dog3){ Dog3 d=(Dog3)a;//downcasting System.out.println('ok downcasting performed'); } } public static void main (String [] args) { Animal a=new Dog3(); Dog3.method(a); } } 
今すぐテストしてください
 Output:ok downcasting performed 

Javaのinstanceofを使用しないダウンキャスト

次の例に示すように、instanceof 演算子を使用せずにダウンキャストを実行することもできます。

 class Animal { } class Dog4 extends Animal { static void method(Animal a) { Dog4 d=(Dog4)a;//downcasting System.out.println('ok downcasting performed'); } public static void main (String [] args) { Animal a=new Dog4(); Dog4.method(a); } } 
今すぐテストしてください
 Output:ok downcasting performed 

これを詳しく見てみましょう。a によって参照される実際のオブジェクトは、Dog クラスのオブジェクトです。だから、それをダウンキャストしても大丈夫です。しかし、次のように書くとどうなるでしょうか。

 Animal a=new Animal(); Dog.method(a); //Now ClassCastException but not in case of instanceof operator 

Javaでのinstanceofの実際の使用法を理解する

以下の例で、instanceof キーワードの実際の使用法を見てみましょう。

 interface Printable{} class A implements Printable{ public void a(){System.out.println('a method');} } class B implements Printable{ public void b(){System.out.println('b method');} } class Call{ void invoke(Printable p){//upcasting if(p instanceof A){ A a=(A)p;//Downcasting a.a(); } if(p instanceof B){ B b=(B)p;//Downcasting b.b(); } } }//end of Call class class Test4{ public static void main(String args[]){ Printable p=new B(); Call c=new Call(); c.invoke(p); } } 
今すぐテストしてください
 Output: b method