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,走此分支
		}

	}

}

运行输出:
java的instanceof操作符_第1张图片

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

下面的代码示例,一个Fruit的对象和String类型对比,类型不可比较,编译出错:
java的instanceof操作符_第2张图片
java的instanceof操作符_第3张图片

一个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的对象,和一个类型对比,两者的类型不可以比较,编译出错:
java的instanceof操作符_第4张图片
java的instanceof操作符_第5张图片

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

java的instanceof操作符_第6张图片
java的instanceof操作符_第7张图片

泛型相比

package com.thb;

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

public class Test4 {

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

}
 
  

                            
                        
                    
                    
                    

你可能感兴趣的:(java,开发语言)