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 extends AbstractList
implements List , 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的对象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类型,所以输出结果为“这个动物不是牛!”。