java instanceof关键字详细介绍

KLQ 2020-09-04 10:40:07 java常见问答 7741

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工具网来了解哦。

推荐阅读:

java super关键字,super和this的区别介绍

java关键字有哪些?java关键字大全

java语言关键字有哪些?都有什么用处?