instanceof关键字在java当中也是很重要的,但是有很多人对于它都不是很了解,那么下面就一起通过文章来进行一下详细的了解吧。
instanceof是Java当中的一个双目运算符,因为,它是由字母组成的,所以也是Java的保留关键字。
在Java当中能够使用nstanceof关键字来判断一个对象是否为一个类,又或者是接口、抽象类和父类的实例,下面是语法格式:
boolean result = obj instanceof Class
obj是一个对象,Class表示一个类或接口;obj是class类(或接口的实例或者子类实例的时候,结果result返回true,否则返回false。
Java instanceof关键字的用法:
1、声明一个class类的对象,判断obj是否为class类的实例对象(很普遍的一种用法):
Integer integer = new Integer(1); System.out.println(integer instanceof Integer); // true
2、声明一个class接口实现类的对象obj,判断obj是否为class接口实现类的实例对象:
java集合当中的List接口有个典型实现ArrayList:
public class ArrayList < E > extends AbstractList < E > implements List < E > , RandomAccess, Cloneable, java.io.Serializable
所以的话可以使用instanceof运算符判断ArrayList类的对象是否属于List接口的实例,假如是返回true,否则返回false。
ArrayList arrayList = new ArrayList(); System.out.println(arrayList instanceof List); // true
或者反过来也是返回true。
List list = new ArrayList(); System.out.println(list instanceof ArrayList); // true
3、obj是class类的直接或间接子类
新建一个父类Person.class。
代码:
public class Person {}
创建Person的子类Man。
代码:
public class Man extends Person {}
测试代码:
Person p1 = new Person(); Person p2 = new Man(); Man m1 = new Man(); System.out.println(p1 instanceof Man); // false System.out.println(p2 instanceof Man); // true System.out.println(m1 instanceof Man); // true
第四行代码当中,Man是Person的子类,Person不是Man的子类,所以返回结果为false。
obj必须为引用类型,不能是基本类型。
例:
int i = 0; System.out.println(i instanceof Integer); // 编译不通过 System.out.println(i instanceof Object); // 编译不通过
instanceof运算符只能用作对象的判断。
在obj为null的时候,直接返回false,因为null没有引用任何对象。
Integer i = 1; System.out.println(i instanceof null); // false
obj的类型必须是引用类型或空类型,否则会编译错误。
在class为null的时候,会发生编译错误,错误信息如下:
Syntax error on token "null", invalid ReferenceType
所以class只可以是类或者是接口。
编译器会检查obj能否转换成右边的class类型,假如,不可以转换那么直接报错,假如,不能确定类型,那么通过编译。
举例说明:
Person p1 = new Person(); System.out.println(p1 instanceof String); // 编译报错 System.out.println(p1 instanceof List); // false System.out.println(p1 instanceof List < ? > ); // false System.out.println(p1 instanceof List < Person > ); // 编译报错
Person的对象p1很明显不能转换为String对象,那么p1 instanceof String不能通过编译,但p1 instanceof List却能通过编译,而instanceof List又不能通过编译了。
如图:
可以理解成下面的代码:
boolean result; if (obj == null) { result = false; // 当obj为null时,直接返回false } else { try { // 判断obj是否可以强制转换为T T temp = (T) obj; result = true; } catch (ClassCastException e) { result = false; } }
在T不为null和obj不为null时,假如,obj能够转换成T而不引发异常(ClassCastException),那么这个表达式值为true ,否则值为false。
这样的话就比较好理解了,p1 instanceof String会编译报错,是因为(String)p1是不能通过编译的,而(List)p1可以通过编译。
instanceof也经常和三目(条件)运算符一起使用。
代码:
A instanceof B ? A : C
判断A是否可以转换为B ,假如可以转换返回A ,不可以转换则返回C。
下面通过一个例子来讲解。
代码:
public class Test { public Object animalCall(Animal a) { String tip = "这个动物不是牛!"; // 判断参数a是不是Cow的对象 return a instanceof Cow ? (Cow) a : tip; } public static void main(String[] args) { Sheep sh = new Sheep(); Test test = new Test(); System.out.println(test.animalCall(sh)); } } class Animal {} class Cow extends Animal {} class Sheep extends Animal {}
在上面的代码当中,声明了一个Animal类作为父类,Cow类和Sheep类为Animal的子类。
在Test类的main函数中创建类Sheep的对象作为形参传递到animalCall方法中,因为Sheep类的对象不能转换为Cow类型,所以输出结果为“这个动物不是牛!”。
java instanceof关键字你都了解了吗?更多java入门内容,可以继续通过关注奇Q工具网来了解哦。
推荐阅读: