ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

Java:instanceof演算子のメモ

Javaのinstanceofのメモ

class C {}
class D extends C{}
interface E {}
class F implements E{}
class G extends F{}
public class Sample {
    public static void main(String[] args) {
        C c = new C();
        System.out.println("c instanceof C:" + (c instanceof C)); //c instanceof C:true
        System.out.println("c instanceof D:"+ (c instanceof D));  //c instanceof D:false
        System.out.println("c instanceof E:"+ (c instanceof E));  //c instanceof E:false
        System.out.println("c instanceof F:compile error");
        System.out.println("c instanceof G:compile error");        
        D d = new D();
        System.out.println("d instanceof C:" + (d instanceof C));  //d instanceof C:true
        System.out.println("d instanceof D:" + (d instanceof D));  //d instanceof D:true
        System.out.println("d instanceof E:" + (d instanceof E));  //d instanceof E:false
        System.out.println("d instanceof F:compile error");
        System.out.println("d instanceof G:compile error");
        E ef = new F();
        System.out.println("ef instanceof C:" + (ef instanceof C)); //ef instanceof C:false
        System.out.println("ef instanceof D:" + (ef instanceof D)); //ef instanceof D:false
        System.out.println("ef instanceof E:" + (ef instanceof E)); //ef instanceof E:true
        System.out.println("ef instanceof F:" + (ef instanceof F)); //ef instanceof F:true
        System.out.println("ef instanceof G:" + (ef instanceof G)); //ef instanceof G:false
        E eg = new G();
        System.out.println("eg instanceof C:" + (eg instanceof C)); //eg instanceof C:false
        System.out.println("eg instanceof D:" + (eg instanceof D)); //eg instanceof D:false
        System.out.println("eg instanceof E:" + (eg instanceof E)); //eg instanceof E:true
        System.out.println("eg instanceof F:" + (eg instanceof F)); //eg instanceof F:true
        System.out.println("eg instanceof G:" + (eg instanceof G)); //eg instanceof G:true
        F f = new F();
        System.out.println("f instanceof C:compile error");
        System.out.println("f instanceof D:compile error");
        System.out.println("f instanceof E:" + (f instanceof E)); //f instanceof E:true
        System.out.println("f instanceof F:" + (f instanceof F)); //f instanceof F:true
        System.out.println("f instanceof G:" + (f instanceof G)); //f instanceof G:false
        G g = new G();
        System.out.println("g instanceof C:compile error");
        System.out.println("g instanceof D:compile error");
        System.out.println("g instanceof E:"+(g instanceof E)); //g instanceof E:true
        System.out.println("g instanceof E:"+(g instanceof F)); //g instanceof E:true
        System.out.println("g instanceof E:"+(g instanceof G)); //g instanceof E:true
    }
}

実行結果

c instanceof C:true
c instanceof D:false
c instanceof E:false
c instanceof F:compile error
c instanceof G:compile error
d instanceof C:true
d instanceof D:true
d instanceof E:false
d instanceof F:compile error
d instanceof G:compile error
ef instanceof C:false
ef instanceof D:false
ef instanceof E:true
ef instanceof F:true
ef instanceof G:false
eg instanceof C:false
eg instanceof D:false
eg instanceof E:true
eg instanceof F:true
eg instanceof G:true
f instanceof C:compile error
f instanceof D:compile error
f instanceof E:true
f instanceof F:true
f instanceof G:false
g instanceof C:compile error
g instanceof D:compile error
g instanceof E:true
g instanceof E:true
g instanceof E:true
  • instanceof演算子はインターフェースを実装しているか、クラスを継承しているかすれば、trueを返却する。
  • クラスは継承をしていない・されていないクラスを指定した場合はコンパイルエラーになる。
  • インターフェースは実装されていなくてもエラーにはならない。