Java でオブジェクトが特定の型であるかどうかをチェックする方法

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、Java で instanceof 演算子を使用してオブジェクトが特定の型であるかどうかをチェックする方法を学びます。まず、継承を含むさまざまなクラスでの instanceof の基本的な使い方を理解します。

次に、さまざまなクラス型で instanceof 演算子をテストし、サブクラスとスーパークラスでの動作を調べます。最後に、潜在的なエラーを回避するために instanceof を使用する際に null オブジェクトをどのように扱うかを学びます。

instanceof 演算子を使用する

このステップでは、Java の instanceof 演算子について学びます。instanceof 演算子は、オブジェクトが特定のクラスのインスタンスであるか、または特定のインターフェースを実装しているかをテストするために使用されます。これは、実行時にオブジェクトの型をチェックするための便利なツールです。

instanceof 演算子の動作を示すために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルが開いていない場合は、開きます。

  2. ファイルの内容全体を次のコードに置き換えます。

    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 のインスタンスであるかどうかをチェックしています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルで javac コマンドを使用してプログラムをコンパイルします。

    javac HelloJava.java
    
  5. 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 演算子をテストします。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. ファイルに Car という新しいクラスを追加します。このクラス定義は、Animal、Dog、Cat クラスの前または後に追加できますが、HelloJava クラスの外に配置してください。

    class Car {
        public void drive() {
            System.out.println("Driving a car");
        }
    }
    
  3. 次に、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 チェックを追加しました。

  4. ファイルを保存します(Ctrl+S または Cmd+S)。

  5. 変更したプログラムをコンパイルします。

    javac HelloJava.java
    
  6. プログラムを実行します。

    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 演算子をテストしましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 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 チェックを行っています。

  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. プログラムをコンパイルします。

    javac HelloJava.java
    
  5. プログラムを実行します。

    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 がオブジェクトの実際のクラス、そのスーパークラス、および関係のないクラスに対してチェックする際の動作も調べました。