Java中的instanceof运算符
时间:2020-01-09 10:34:47 来源:igfitidea点击:
Java中的instanceof运算符用于在运行时测试对象的类型。
Java instanceof运算符的语法如下:
objRef instanceof objType
这里objRef是对实例的引用。
objType表示类类型。
使用instanceof运算符,我们可以检查objRef是否为objType类型。如果是,则instanceof运算符返回true,否则返回false。
在Java中使用instanceof运算符
instanceof运算符可以帮助防止在运行时ClassCastException。
例如,父类引用可以引用子类,而相反,子类引用父类会导致编译时错误而没有类型转换。
Child c = new Parent(); // Compile time error // Ok with downcasting, may result in ClassCastException Child c = (Child) new Parent();
如果有多个子级并且我们在不知道实际类型的情况下进行转换,则此向下转换(父级到子级)将导致ClassCastException。以下Java示例显示了此场景,其中有两个子类Child和AnotherChild。在methodToCast方法中,即使传递AnotherChild引用导致ClassCastException,我们仍尝试将其强制转换为Child。
public class Test { public static void main(String[] args) { Child c = new Child(); Parent p = new Parent(); AnotherChild ac = new AnotherChild(); // ok, upcasting to parent reference p = c; methodToCast(c); methodToCast(ac); } private static void methodToCast(Parent p) { Child c = (Child)p; } } class Parent { public void method1() { System.out.println("In method"); } } class Child extends Parent { public void method1() { System.out.println("In child method"); } } class AnotherChild extends Parent { public void method1() { System.out.println("In Anotherchild method"); } }
输出:
Exception in thread "main" java.lang.ClassCastException: com.theitroad.programs.AnotherChild cannot be cast to com.theitroad.programs.Child at com.theitroad.programs.Test.methodToCast(Test.java:15) at com.theitroad.programs.Test.main(Test.java:11)
在这种情况下,我们需要使用instanceof运算符来检查引用的类型。
private static void methodToCast(Parent p) { if(p instanceof Child) { Child c = (Child)p; } }
考虑具有多级继承的另一种情况。
public class Test { public static void main(String[] args) { Parent p = new Parent(); Child c = new Child(); AnotherChild ac = new AnotherChild(); GrandChild gc = new GrandChild(); methodToCast(c); methodToCast(gc); methodToCast(ac); } private static void methodToCast(Parent p) { Child c = (Child)p; c.method1(); } } class Parent { public void method1() { System.out.println("In Parent method"); } } class Child extends Parent { public void method1() { System.out.println("In Child method"); } } class AnotherChild extends Parent { public void method1() { System.out.println("In Anotherchild method"); } } class GrandChild extends Child { public void method1() { System.out.println("In GrandChild method"); } }
输出:
In Child method In GrandChild method Exception in thread "main" java.lang.ClassCastException: com.theitroad.programs.AnotherChild cannot be cast to com.theitroad.programs.Child at com.theitroad.programs.Test.methodToCast(Test.java:15) at com.theitroad.programs.Test.main(Test.java:11)
如我们所见,铸造为Child和GrandChild(也属于Child类型)而进行,但是对ParentChild类型为ParentChild抛出ClassCastException。在这种情况下,使用instanceof运算符检查类型可确保仅针对子类型引用调用该方法。
private static void methodToCast(Parent p) { if(p instanceof Child) { Child c = (Child)p; c.method1(); } }
关于Java中的instanceof运算符的要点
1如果对象引用为null,instanceof运算符将返回false。
public class Test { public static void main(String[] args) { Test obj = null; if(obj instanceof Test) { System.out.println("instance of operator returns true"); }else { System.out.println("instance of operator returns false"); } } }
输出:
instance of operator returns false
2使用Object类的instanceof运算符进行测试始终返回true,因为Object类是Java中所有类的超类。
public class Test { public static void main(String[] args) { Test obj = new Test(); Parent p = new Parent(); if(obj instanceof Object) { System.out.println("instance of operator returns true"); }else { System.out.println("instance of operator returns false"); } if(p instanceof Object) { System.out.println("instance of operator returns true"); }else { System.out.println("instance of operator returns false"); } } } class Parent { public void method1() { System.out.println("In Parent method"); } }
输出:
instance of operator returns true instance of operator returns true