java的instanceof操作符

说明

java的instanceof操作符可以用于类型的比较或者模式匹配比较。instanceof关键字左边是对象的引用,右边是引用类型或者模式。
如果instanceof关键字右边是一个引用类型,那么instanceof关键字是一个类型比较操作符。
如果instanceof关键字右边是一个模式,那么instanceof关键字是一个模式匹配操作符。

当用于类型比较:

  • 操作符左边必须是一个引用类型、或者null,否则编译出错。
  • 如果操作符左边的引用对象不是null,并且可以转化为右边的对象类型,那么结果为true,否则结果为false。也就是说,左边的对象是右边类型本身或者子类的对象,结果为true。
  • 操作符左边的引用对象必须能和操作符右边的类型相比较,否则会编译出错。所谓能比较,就是有继承性关系。
  • 如果操作符左边是一个原始类型(即非引用类型),那么编译出错。

代码示例

作为类型比较操作符、且类型可以比较

定义一个父类和一个子类:

// 父类
package com.thb;

public class Fruit {
	protected int color;
}

// 子类
package com.thb;

public class Apple extends Fruit {
	private int smell;
}

定义一个主类:

package com.thb;

public class Test4 {

	public static void main(String[] args) {		
		Fruit fruit = new Fruit();
		Apple apple1 = new Apple();		
		Apple apple2 = null;
		
		if (apple1 instanceof Fruit) {			
			System.out.println("apple1 is fruit");  // apple1是Fruit类型,走此分支
		} else {
			System.out.println("apple1 is not fruit");
		}
		
		if (fruit instanceof Apple) {
			System.out.println("fruit is apple");
		} else {
			System.out.println("fruit is not apple");  // fruit不是Apple实例,走此分支
		}
		
		
		if (apple2 instanceof Fruit) { 
			System.out.println("apple2 is fruit");
		} else {
			System.out.println("apple2 is not fruit"); // apple2值为null,走此分支
		}

	}

}

运行输出:
在这里插入图片描述

作为类型比较操作符、但类型不可比较

下面的代码示例,一个Fruit的对象和String类型对比,类型不可比较,编译出错:
在这里插入图片描述
在这里插入图片描述

一个null对象和一个类型对比、但类型可对比

定义一个null的对象,和一个类型对比,两者的类型是可以对比的,编译不会出错,但结果为false:

package com.thb;

public class Test4 {

	public static void main(String[] args) {		
		String a = null;

		if (a instanceof String) {
			System.out.println("a is a String");
		} else {
			System.out.println("a is not a String");
		}
	}

}

运行输出:
在这里插入图片描述

一个null对象和一个类型对比、但类型不可对比:编译出错

定义一个null的对象,和一个类型对比,两者的类型不可以比较,编译出错:
在这里插入图片描述
在这里插入图片描述

一个原始类型变量和一个引用类型对比,编译出错

在这里插入图片描述
在这里插入图片描述

泛型相比

package com.thb;

import java.util.ArrayList;
import java.util.List;

public class Test4 {

	public static void main(String[] args) {		
		List<Short> shortList = new ArrayList<Short>();
		
		// 这个比较结果为true,因为List<Short>可以转换为ArrayList<Short>
		if (shortList instanceof ArrayList<Short>) {  
			System.out.println("ok");
		}
		
		// 这个编译出错,因为List<Short>不能转换为ArrayList<Date>
		if (shortList instanceof ArrayList<Date>) {
			System.out.println("ok");
		}
		
		// 这个编译出错,因为List<Short>不能转换为ArrayList<Object>
		if (shortList instanceof ArrayList<Object>) {
			System.out.println("ok");
		}
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值