English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このトレーニングでは、例を通じてJavaのinstanceof演算子について詳細に学びます。
Javaでは、instanceofキーワードは二進演算子です。特定のクラスのインスタンスであるかどうかをチェックするために使用されます。
演算子はまた、オブジェクトがインターフェースを実装するクラスのインスタンスであるかどうかもチェックします(このトレーニングの後で説明します)。
instanceofの文法は:
result = objectName instanceof className;
instanceof演算子の左操作数はオブジェクト名、右操作数はクラス名です。オブジェクトがそのクラスのインスタンスである場合、結果はtrue;でない場合はfalseです。
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演算子はサブクラスのオブジェクトが超クラスのインスタンスでもあるかどうかをチェックするために使用されます。
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です。
Javaでは、すべてのクラスはObjectクラスを継承しており、Objectクラスを継承するにはextendsキーワードを使用しません。この継承はJavaでは暗黙的に発生します。
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コンパイラが自動的に上位型変換を実行します。
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では、明示的にコンパイラに下位型変換を指示する必要があります。
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演算子を使用できます。その方法は以下の通りです:
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演算子は、クラスのオブジェクトがそのクラスのインターフェースを実装するインスタンスであるかどうかをチェックするためにも使用されます。
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インターフェースのインスタンスでもあります。