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

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/inheritance("Inheritance") subgraph Lab Skills java/if_else -.-> lab-560012{{"Java でオブジェクトが特定の型であるかどうかをチェックする方法"}} java/classes_objects -.-> lab-560012{{"Java でオブジェクトが特定の型であるかどうかをチェックする方法"}} java/inheritance -.-> lab-560012{{"Java でオブジェクトが特定の型であるかどうかをチェックする方法"}} end

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 つのサブクラス DogCat を定義しています。
    • main メソッドでは、Animal 型の変数 myAnimal を作成し、Dog オブジェクトを代入しています。
    • その後、instanceof 演算子を使用して、myAnimalDogCatAnimal のインスタンスであるかどうかをチェックしています。
  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

    ご覧のとおり、myAnimalDog のインスタンスです(Dog オブジェクトを作成したため)。また、Animal のインスタンスでもあります(DogAnimal のサブクラスであるため)。ただし、Cat のインスタンスではありません。

異なるクラスでのテスト

前のステップでは、instanceof がサブクラスとそのスーパークラスでどのように動作するかを見ました。今度は、異なる関係のないクラスに対してテストする場合の動作を調べてみましょう。

既存の HelloJava.java ファイルを変更して、別のクラスを追加し、異なる型のオブジェクトで instanceof 演算子をテストします。

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

  2. ファイルに Car という新しいクラスを追加します。このクラス定義は、AnimalDogCat クラスの前または後に追加できますが、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 を追加し、CarAnimal に対する 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

    この出力から、myCarCar のインスタンスであることが確認できますが、CarAnimal を継承していないため、Animal のインスタンスではありません。instanceof 演算子は、オブジェクトとクラスの間の型関係(またはその欠如)を正しく識別します。

ヌルオブジェクトの扱い

この最後のステップでは、instanceof 演算子が null オブジェクトを扱う際の動作を調べます。これを理解することは、プログラムで予期しないエラーを回避するために重要です。

Java での null 参照とは、変数が何らかのオブジェクトを参照していないことを意味します。null 参照に対して instanceof 演算子を使用すると、常に false が返されます。これは演算子の組み込みの安全機能です。

HelloJava.java ファイルを最後に一度変更して、null オブジェクトを含め、instanceof 演算子をテストしましょう。

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

  2. HelloJava クラス内の main メソッドを変更して、nullAnimal 参照を含め、テストします。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 ---

    nullAnimalif ブロック内の行が表示されていないことに注意してください。これは、nullAnimal instanceof AnimalnullAnimal instanceof Dog の両方が false と評価されるためです。これは、instanceof 演算子が null 参照を正しく扱い、false を返すことを示しています。

instanceofnull とどのように動作するかを理解することは、NullPointerException エラーを回避する堅牢な Java コードを書くために重要です。

まとめ

この実験では、Java で instanceof 演算子を使用してオブジェクトが特定の型であるかどうかをチェックする方法を学びました。基本クラスとそのサブクラスを含む異なるクラスで instanceof を使用し、オブジェクトの実行時の型を判断する練習を行いました。また、instanceof がオブジェクトの実際のクラス、そのスーパークラス、および関係のないクラスに対してチェックする際の動作も調べました。