English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java プロセス制御

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 異常処理

Java リスト(List)

Java Queue(キュー)

Java Mapコレクション

Java Setコレクション

Java 入出力(I/O)

Java Reader/Writer

Java その他のトピック

Java instanceofキーワード

このトレーニングでは、例を通じてJavaのinstanceof演算子について詳細に学びます。

Javaでは、instanceofキーワードは二進演算子です。特定のクラスのインスタンスであるかどうかをチェックするために使用されます。

演算子はまた、オブジェクトがインターフェースを実装するクラスのインスタンスであるかどうかもチェックします(このトレーニングの後で説明します)。

instanceofの文法は:

result = objectName instanceof className;

 instanceof演算子の左操作数はオブジェクト名、右操作数はクラス名です。オブジェクトがそのクラスのインスタンスである場合、結果はtrue;でない場合はfalseです。

例1:instanceof

class Main {
    public static void main(String[] args) {
        String name = "w3codebox";
        Integer age = 22;
        System.out.println("nameはStringのインスタンスですか: "+ (name instanceof String));
        System.out.println("ageはIntegerのインスタンスですか: "+ (age instanceof Integer));
    }
}

出力

nameはStringのインスタンスですか: true
ageはIntegerのインスタンスですか: true

上記の例では、StringタイプのオブジェクトnameとIntegerタイプのオブジェクトageをそれぞれ作成しました。その後、instanceof演算子を使用してnameがStringタイプかどうか、ageがIntegerタイプかどうかをチェックしました。

instanceofと継承

継承の場合、instanceof演算子はサブクラスのオブジェクトが超クラスのインスタンスでもあるかどうかをチェックするために使用されます。

例2:継承におけるinstanceof

class Animal {
}
//DogクラスはAnimalのサブクラスです
class Dog extends Animal {
}
class Main {
    public static void main(String[] args){
        Dog d1 = new Dog();
        //dをチェックしました1Dogのオブジェクトですか
        System.out.println("d1Dogのインスタンスですか: "+ (d1 instanceof Dog));
       
        //dをチェックしました1Animalのオブジェクトですか
        System.out.println("d1Animalのインスタンスですか: "+ (d1 instanceof Animal));
    }
}

出力

d1Dogのインスタンスですか: true
d1Animalのインスタンスですか: true

上記の例では、d1はDogとAnimalクラスのインスタンスです。したがって、d1 instanceof Dog と d1 instanceof Animal はすべてtrueです。

Objectクラス

Javaでは、すべてのクラスはObjectクラスを継承しており、Objectクラスを継承するにはextendsキーワードを使用しません。この継承はJavaでは暗黙的に発生します。

例3:Objectクラス

class Animal {
}
class Dog {
}
class Cat {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = new Animal();
        Cat c1 = new Cat();
        System.out.println("d1Objectクラスのインスタンスですか: "+ (d1 instanceof Object));
        System.out.println("a1Objectクラスのインスタンスですか: "+ (a1 instanceof Object));   
        System.out.println("c1Objectクラスのインスタンスですか: "+ (c1 instanceof Object));
    }
}

出力

d1Objectクラスのインスタンスですか: true
a1Objectクラスのインスタンスですか: true
c1Objectクラスのインスタンスですか: true

上記の例では、Animal、Dog、Catのクラスのオブジェクトaをそれぞれ作成しました。1、d1とc1これらのオブジェクトaに対してinstanceof演算子を使用してチェックしました。1, d1, c1Objectクラスのオブジェクトでもありますか。出力結果はすべてtrue(真)です。

これは、Objectクラスがjava.langパッケージで定義されているルートクラスだからです。すべての他のクラスは、JavaでObjectクラスのサブクラスとして階層構造を形成しています。

オブジェクトの上位型変換と下位型変換

Javaでは、子クラスのオブジェクトは親クラスのオブジェクトとして見なされます。これを上位型変換と呼びます。一般的には、子クラスのオブジェクトを親クラスのオブジェクトに変換することです。ここでは、親クラスのオブジェクトはインターフェースでもできます。

Javaコンパイラが自動的に上位型変換を実行します。

例4:上位型変換

class Animal {
    public void displayInfo() {
        System.out.println("I am an animal.");
    }
}
class Dog extends Animal {
}
class Main {
    public static void main(String[] args) {
        Dog d1 = new Dog();
        Animal a1 = d1;
        a1.displayInfo();
    }
}

出力

I am an animal.

上記の例では、Dogクラスのオブジェクトdを生成1。1オブジェクトをAnimalクラスのオブジェクトaに作成1。

このコードは何の問題もなく実行されます。これは、上位型変換がJavaコンパイラによって自動的に行われるためです。

下位型変換は上位型変換の逆プロセスであり、上位型変換とは逆に、親クラスのオブジェクトを子クラスのオブジェクトに変換することです。

下位型変換の場合、親クラスのオブジェクトは子クラスのオブジェクトとして見なされます。Javaでは、明示的にコンパイラに下位型変換を指示する必要があります。

例5:下位型変換の問題

class Animal {
}
class Dog extends Animal {
   public void displayInfo() {
       System.out.println("I am a dog.");
   }
}
class Main {
   public static void main(String[] args) {
       Animal a1 = new Animal();
       Dog d1 = (Dog)a1; // 下位型変換
 
       d1.displayInfo();
   }
}

プログラムを実行すると、ClassCastExceptionが発生します。ここで何が起こっているのかを見てみましょう。

ここでは、親クラスAnimalのオブジェクトa1。1オブジェクトを子クラスDogのオブジェクトdに強制的に変換1。

これが問題を引き起こします。これは、親クラスAnimalのa1オブジェクトは他のサブクラスを参照することもできます。例えば、Dogと一緒に別のサブクラスCatを生成すると、動物は猫でも犬でもあり、曖昧さが生じます。

この問題を解決するために、instanceof演算子を使用できます。その方法は以下の通りです:

例6:下位型変換の問題をinstanceofで解決

class Animal {
}
class Dog extends Animal {
  public void displayInfo() {
     System.out.println("I am a dog");
  }
}
class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    Animal a1 = d1;    // 上位型変換
    if (a1 instanceof Dog){
       Dog d2 = (Dog)a1;    // 下位型変換
       d2.displayInfo();
    }
  }
}

出力

I am a dog

上記の例では、a1オブジェクトがDogクラスのインスタンスかどうか。1 instanceof Dogがtrueの時にのみ下位型への変換が行われます。

インターフェースとinstanceof

instanceof演算子は、クラスのオブジェクトがそのクラスのインターフェースを実装するインスタンスであるかどうかをチェックするためにも使用されます。

例7:インターフェース内のinstanceof

interface Animal {
}
class Dog implements Animal {
}
class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      System.out.println("d1オブジェクトがAnimalのインスタンスですか: "+(d1 instanceof Animal));
   }
}

出力

d1オブジェクトがAnimalのインスタンスですか: true

上記の例では、Animalインターフェースを実装するDogクラスを生成しました。

次に、Dogクラスのオブジェクトdを生成します。1。すでにinstanceof演算子を使用してdをチェックしています。1オブジェクトがAnimalインターフェースのインスタンスでもあります。