はじめに
この実験では、Java で instanceof 演算子を使用してオブジェクトが特定の型であるかどうかをチェックする方法を学びます。まず、継承を含むさまざまなクラスでの instanceof の基本的な使い方を理解します。
次に、さまざまなクラス型で instanceof 演算子をテストし、サブクラスとスーパークラスでの動作を調べます。最後に、潜在的なエラーを回避するために instanceof を使用する際に null オブジェクトをどのように扱うかを学びます。
instanceof 演算子を使用する
このステップでは、Java の instanceof 演算子について学びます。instanceof 演算子は、オブジェクトが特定のクラスのインスタンスであるか、または特定のインターフェースを実装しているかをテストするために使用されます。これは、実行時にオブジェクトの型をチェックするための便利なツールです。
instanceof 演算子の動作を示すために、簡単な Java プログラムを作成しましょう。
WebIDE エディタで
HelloJava.javaファイルが開いていない場合は、開きます。ファイルの内容全体を次のコードに置き換えます。
class Animal { public void makeSound() { System.out.println("Generic animal sound"); } } class Dog extends Animal { public void makeSound() { System.out.println("Woof!"); } } class Cat extends Animal { public void makeSound() { System.out.println("Meow!"); } } public class HelloJava { public static void main(String[] args) { Animal myAnimal = new Dog(); if (myAnimal instanceof Dog) { System.out.println("myAnimal is an instance of Dog"); } if (myAnimal instanceof Cat) { System.out.println("myAnimal is an instance of Cat"); } if (myAnimal instanceof Animal) { System.out.println("myAnimal is an instance of Animal"); } } }このコードでは、以下のことを行っています。
- 基底クラス
Animalと 2 つのサブクラスDogとCatを定義しています。 mainメソッドでは、Animal型の変数myAnimalを作成し、Dogオブジェクトを代入しています。- その後、
instanceof演算子を使用して、myAnimalがDog、Cat、Animalのインスタンスであるかどうかをチェックしています。
- 基底クラス
ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルで
javacコマンドを使用してプログラムをコンパイルします。javac HelloJava.javajavaコマンドを使用してコンパイルされたプログラムを実行します。java HelloJavainstanceofチェックが true を返したものを示す出力が表示されるはずです。myAnimal is an instance of Dog myAnimal is an instance of Animalご覧のとおり、
myAnimalはDogのインスタンスです(Dogオブジェクトを作成したため)。また、Animalのインスタンスでもあります(DogはAnimalのサブクラスであるため)。ただし、Catのインスタンスではありません。
異なるクラスでテストする
前のステップでは、instanceof がサブクラスとそのスーパークラスでどのように動作するかを見ました。今度は、異なる関係のないクラスに対してテストする場合の動作を調べてみましょう。
既存の HelloJava.java ファイルを変更して、別のクラスを追加し、異なる型のオブジェクトで instanceof 演算子をテストします。
WebIDE エディタで
HelloJava.javaファイルを開きます。ファイルに
Carという新しいクラスを追加します。このクラス定義は、Animal、Dog、Catクラスの前または後に追加できますが、HelloJavaクラスの外に配置してください。class Car { public void drive() { System.out.println("Driving a car"); } }次に、
HelloJavaクラス内のmainメソッドを変更して、Carオブジェクトを作成し、instanceof演算子をテストします。mainメソッドを以下のように更新します。public class HelloJava { public static void main(String[] args) { Animal myAnimal = new Dog(); Car myCar = new Car(); if (myAnimal instanceof Dog) { System.out.println("myAnimal is an instance of Dog"); } if (myAnimal instanceof Cat) { System.out.println("myAnimal is an instance of Cat"); } if (myAnimal instanceof Animal) { System.out.println("myAnimal is an instance of Animal"); } System.out.println("--- Testing Car object ---"); if (myCar instanceof Car) { System.out.println("myCar is an instance of Car"); } if (myCar instanceof Animal) { System.out.println("myCar is an instance of Animal"); } } }新しい
CarオブジェクトmyCarを追加し、CarとAnimalに対するinstanceofチェックを追加しました。ファイルを保存します(Ctrl+S または Cmd+S)。
変更したプログラムをコンパイルします。
javac HelloJava.javaプログラムを実行します。
java HelloJava出力を観察しましょう。前のステップの結果の後に、
Carオブジェクトに対する新しいチェックの結果が表示されるはずです。myAnimal is an instance of Dog myAnimal is an instance of Animal --- Testing Car object --- myCar is an instance of Carこの出力から、
myCarはCarのインスタンスであることが確認できますが、CarはAnimalを継承していないため、Animalのインスタンスではありません。instanceof演算子は、オブジェクトとクラスの間の型関係(またはその欠如)を正しく識別します。
null オブジェクトを扱う
この最後のステップでは、instanceof 演算子が null オブジェクトを扱う際の動作を調べます。これを理解することは、プログラムで予期しないエラーを回避するために重要です。
Java での null 参照とは、変数が何らかのオブジェクトを参照していないことを意味します。null 参照に対して instanceof 演算子を使用すると、常に false が返されます。これは演算子の組み込みの安全機能です。
HelloJava.java ファイルを最後に一度変更して、null オブジェクトを含め、instanceof 演算子をテストしましょう。
WebIDE エディタで
HelloJava.javaファイルを開きます。HelloJavaクラス内のmainメソッドを変更して、nullのAnimal参照を含め、テストします。mainメソッドを以下のように更新します。class Animal { public void makeSound() { System.out.println("Generic animal sound"); } } class Dog extends Animal { public void makeSound() { System.out.println("Woof!"); } } class Cat extends Animal { public void makeSound() { System.out.println("Meow!"); } } class Car { public void drive() { System.out.println("Driving a car"); } } public class HelloJava { public static void main(String[] args) { Animal myAnimal = new Dog(); Car myCar = new Car(); Animal nullAnimal = null; // Declare a null Animal reference if (myAnimal instanceof Dog) { System.out.println("myAnimal is an instance of Dog"); } if (myAnimal instanceof Cat) { System.out.println("myAnimal is an instance of Cat"); } if (myAnimal instanceof Animal) { System.out.println("myAnimal is an instance of Animal"); } System.out.println("--- Testing Car object ---"); if (myCar instanceof Car) { System.out.println("myCar is an instance of Car"); } if (myCar instanceof Animal) { System.out.println("myCar is an instance of Animal"); } System.out.println("--- Testing null object ---"); if (nullAnimal instanceof Animal) { System.out.println("nullAnimal is an instance of Animal"); } if (nullAnimal instanceof Dog) { System.out.println("nullAnimal is an instance of Dog"); } } }新しい
Animal変数nullAnimalを追加し、nullで初期化しました。その後、これに対してinstanceofチェックを行っています。ファイルを保存します(Ctrl+S または Cmd+S)。
プログラムをコンパイルします。
javac HelloJava.javaプログラムを実行します。
java HelloJava出力を観察しましょう。前のステップの結果の後に、
nullAnimalに対するチェックの結果が表示されるはずです。myAnimal is an instance of Dog myAnimal is an instance of Animal --- Testing Car object --- myCar is an instance of Car --- Testing null object ---nullAnimalのifブロック内の行が表示されていないことに注意してください。これは、nullAnimal instanceof AnimalとnullAnimal instanceof Dogの両方がfalseと評価されるためです。これは、instanceof演算子がnull参照を正しく扱い、falseを返すことを示しています。
instanceof が null とどのように動作するかを理解することは、NullPointerException エラーを回避する堅牢な Java コードを書くために重要です。
まとめ
この実験では、Java で instanceof 演算子を使用してオブジェクトが特定の型であるかどうかをチェックする方法を学びました。基本クラスとそのサブクラスを含む異なるクラスで instanceof を使用し、オブジェクトの実行時の型を判断する練習を行いました。また、instanceof がオブジェクトの実際のクラス、そのスーパークラス、および関係のないクラスに対してチェックする際の動作も調べました。



