はじめに
この実験では、Java で instanceof
演算子を使用してオブジェクトが特定の型であるかどうかをチェックする方法を学びます。まず、継承を含むさまざまなクラスでの instanceof
の基本的な使い方を理解します。
次に、さまざまなクラス型で instanceof
演算子をテストし、サブクラスとスーパークラスでの動作を調べます。最後に、潜在的なエラーを回避するために instanceof
を使用する際に null オブジェクトをどのように扱うかを学びます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Java で instanceof
演算子を使用してオブジェクトが特定の型であるかどうかをチェックする方法を学びます。まず、継承を含むさまざまなクラスでの instanceof
の基本的な使い方を理解します。
次に、さまざまなクラス型で instanceof
演算子をテストし、サブクラスとスーパークラスでの動作を調べます。最後に、潜在的なエラーを回避するために instanceof
を使用する際に null オブジェクトをどのように扱うかを学びます。
このステップでは、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.java
java
コマンドを使用してコンパイルされたプログラムを実行します。
java HelloJava
instanceof
チェックが 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
演算子は、オブジェクトとクラスの間の型関係(またはその欠如)を正しく識別します。
この最後のステップでは、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
がオブジェクトの実際のクラス、そのスーパークラス、および関係のないクラスに対してチェックする際の動作も調べました。