instanceof演算子


実装の確認

これまで、Javaのオブジェクト指向とポリモーフィズムの実現を学習し
動的なメソッドやクラスの継承、インターフェイスを覚えました

Java言語はポリモーフィズムをサポートするオブジェクト指向型言語です
これは、Cとは違ってコンパイル時にデータ型が決定されません
メソッドのオーバーライドでは、実行時にデータ型が決定されます
しかし、そのデータ型が実際に何を指しているのか知る必要が出てくる場合があります

そのような場合instanceof演算子が有効です
instanceof演算子は、次のような書式を持ちます

var instanceof type

varには変数名を、typeにはクラスやインターフェイス名を指定します
varがtypeで指定されたクラスやインターフェイスを実装していればtrueが返されます
実装していなければfalseが返されます
この機能から、やはり一般的には制御文で使用します
interface HINA {
	void write(String str , int age);
}

class super_class {
	String name;
	int age;

	public void write(String str , int age) {
		System.out.println(str + "\t" + age);
	}

	super_class(String name , int age) {
		this.name = name;
		this.age = age;
	}
}

class sub_class extends super_class implements HINA {
	public void write(String str , int age) {
		System.out.println(str + "\t" + age);
	}

	sub_class(String str , int age) {
		super(str , age);
	}
}

class test {
	public static void main(String args[]) {
		super_class naru = new super_class("成瀬川なる" , 17);
		super_class sinobu = new sub_class("前原しのぶ" , 13);
		sub_class motoko = new sub_class("青山素子" , 15);

		if (naru instanceof HINA) naru.write(naru.name , naru.age);
		if (sinobu instanceof HINA) sinobu.write(sinobu.name , sinobu.age);
		if (motoko instanceof HINA) motoko.write(motoko.name , motoko.age);
	}
}
このプログラムは、生成したクラス型の変数がインターフェイス HINA を実装しているかどうかを調べます
main()メソッドの最後の3行のif文がそうですね
結果は次のようになります
前原しのぶ      13
青山素子        15
変数naruはsuper_classのオブジェクトを参照しています
super_classはインターフェイスをインプリメントしていないので HINA は実装されていません
よって、naruは偽です

変数motokoはsub_classのオブジェクトを参照しています
sub_classはHINAを実装しているので、当然真を返します。よってwrite()が実行されます

変数sinobuは、変数の型がsuper_classで参照がsub_classです
そのため、真が返されますがsub_classのwrite()メソッドを使用するにはオーバーライドしなくてはなりません

このプログラムの例では、インターフェイスの実装を確認しましたが
instanceof演算子は、あるクラスのオブジェクトかどうかも同じ方法で確認することができます
interface HINA {
	void write(String str , int age);
}

class super_class {
	String name;
	int age;

	public void write(String str , int age) {
		System.out.println(str + "\t" + age);
	}

	super_class(String name , int age) {
		this.name = name;
		this.age = age;
	}
}

class sub_class extends super_class implements HINA {
	public void write(String str , int age) {
		System.out.println(str + "\t" + age);
	}

	sub_class(String str , int age) {
		super(str , age);
	}
}

class test {
	public static void main(String args[]) {
		super_class naru = new super_class("成瀬川なる" , 17);
		super_class sinobu = new sub_class("前原しのぶ" , 13);
		sub_class motoko = new sub_class("青山素子" , 15);

		if (naru instanceof sub_class) naru.write(naru.name , naru.age);
		if (sinobu instanceof sub_class) sinobu.write(sinobu.name , sinobu.age);
		if (motoko instanceof sub_class) motoko.write(motoko.name , motoko.age);
	}
}
最後のif文を改良しています
先ほどはインターフェイスHINAの実装を確認していましたが
今度はオブジェクトが指定クラスかどうかを確認しています


instanceof

左辺で指定されたオブジェクト変数が右辺で指定されたクラスのインスタンスであればtrueを返します
右辺の指定がインターフェイスだった場合は、オブジェクトが指定インターフェイスを実装しているかを確認します
オブジェクトが指定インターフェイスをインプリメントしていればtrueを返します
いずれにも該当しない場合はfalseを返します



前のページへ戻る次のページへ