版权声明:分享,转载原创文章,麻烦注明一下出处~谢谢 https://blog.csdn.net/sc9018181134/article/details/84038336
概念和用法:
instanceof关键字,也可以叫做类型比较运算符,在java中是用来判断一个类是否是另一个类的实例。
用法: boolean object instanceof class
例如:a instanceof A,返回值是布尔型。用法其实是比较简单的,通俗的理解就是左边的实例是否是右边类的子类或者实现。右边的类类型可以以是class,interface,array。参考oraclejdk8的规范,解释一下上面的三句话:
1.instanceof左边的类型必须是引用类型或者null,否则会报错(右边的类型不能为null);
2.instanceof右边的类型不是可具体化的类型时,编译会报错(也就是右边的类型要是可具体化类型,简单的理解为非泛型的类型,因为编译时会被类型擦除,细究可以参考可具体化类型);
3.如果左边强制转换右边的类型失败,那么返回值不会是true(就是说左边不能强转到右边的都会返回false,外国人语境的差异吧,听起来很拗口)
用java代码的形式表示instanceof的实现原理就是:
boolean result;
if (obj == null) {
result = false;
} else {
try {
T temp = (T) obj;
result = true;
} catch (ClassCastException e) {
result = false;
}
}
instanceof使用实例
public class InstanceOfTest {
public static void main(String[] args) {
String [] stringArray = new String[]{};
String text = "我是字符串";
B[] bArray = new B[]{};
B b = new B();
A ab = new B();
System.out.println("class instanceof test");
System.out.println(b instanceof A);
System.out.println(b instanceof B);
System.out.println(b instanceof C);
System.out.println(ab instanceof A);
System.out.println(ab instanceof B);
System.out.println(ab instanceof C);
System.out.println(null instanceof Object);
System.out.println(text instanceof String);
System.out.println("interface instanceof test");
System.out.println(b instanceof B);
System.out.println(b instanceof C);
System.out.println(b instanceof D);
System.out.println(ab instanceof B);
System.out.println(ab instanceof C);
System.out.println(ab instanceof D);
System.out.println("array instanceof test");
System.out.println(b instanceof List);
System.out.println(bArray instanceof A[]);
System.out.println(bArray instanceof B[]);
System.out.println(bArray instanceof C[]);
System.out.println(bArray instanceof D[]);
System.out.println(stringArray instanceof String[]);
}
}
class B extends A implements C {
}
class A {
}
interface C extends D {
}
interface D {
}
通过了上面对instanceof的用法解释,想必这些结果读者应该没有什么太多的疑问,可能比较注意的就是ab的instanceof的使用,ab是指向的B的实例,所以和b基本没有区别,然后instanceof右边的类型使用泛型是会编译报错的,因为泛型是上面说到的非可具体化类型,instanceof还可以用来判断数组。