说明
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");
}
}
}