“你好,阿米戈!你可能已经见过了 instanceof 运算符。今天我会讲解它的使用方式和使用位置。instanceof 是一个很简单又高效的运算符。”

“听起来像不像打广告?”

“它真的是非常简单。就比如这样:对象 instanceof 类。”

它可检查对象是否是特定类的实例。但是好用不好说。请看以下示例:

代码 说明
Object o = new Integer(3);
boolean isInt = o instanceof Integer;
isInt 将为 true。变量 o 引用的对象是 Integer 类的实例。
Object o = "Mama";
boolean isInt = o instanceof Integer;
isInt 将为 false。变量 o 引用的对象不是 Integer 类的实例。它是一个 String 对象。
InputStream is = new FileInputStream("");
boolean isFIS = is instanceof FileInputStream;
isFIS 将为 true。变量 o 引用的对象是 FileInputStream 类的实例。

“对,那个真的非常简单。

“这个运算符还考虑了继承。我们看看。”

代码 说明
class Animal
{
}
class Cat extends Animal
{
}
class Tiger extends Cat
{
}
这里有三个类声明:Animal、Cat 和 Tiger。Cat 继承 Animal。Tiger 继承 Cat。
Object o = new Tiger();
boolean isCat = o instanceof Cat;
boolean isTiger = o instanceof Tiger;
boolean isAnimal = o instanceof Animal;
isCat 将为 true
isTiger 将为 true
isAnimal 将为 true
Object o = new Animal();
boolean isCat = o instanceof Cat;
boolean isTiger = o instanceof Tiger;
boolean isAnimal = o instanceof Animal;
isCat  将为 false
isTiger 将为 false
isAnimal 将为 true

甚至接口:

代码 说明
interface Moveable
{
}
class Cat
{
}
class TomCat extends Cat implements Moveable
{
}
创建两个类:Cat、TomCat 以及 Moveable 接口
Cat o = new TomCat();
boolean isCat = o instanceof Cat;
boolean isMoveable = o instanceof Moveable;
boolean isTom = o instanceof TomCat;
isCat 将为 true
isMoveable 将为 true
isTom 将为 true
Cat o = new Cat();
boolean isCat = o instanceof Cat;
boolean isMoveable = o instanceof Moveable;
boolean isTom = o instanceof TomCat;
isCat 将为 true
isMoveable 将为 false
isTom 将为 false

instanceof 运算符类似于:a instanceof B

换句话说,instanceof 运算符在如下条件下返回 true

1) 变量 a 存储 B 类型对象的引用

2) 变量 a 存储类继承 B 的对象的引用

3) 变量 a 存储实现接口 B 的对象的引用

否则,instanceof 运算符会返回 false

“明白了。所以为什么这个必不可少呢,里希叔叔?”

“艾丽会告诉你。这是一个非常好用的运算符。今天你就会相信这一点。”