Java instanceof关键字详解
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
或者反过来也是返回 trueList 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 {
}
测试代码如下:
第 4 行代码中,Man 是 Person 的子类,Person 不是 Man 的子类,所以返回结果为 false。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
值得注意的是 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 很明显不能转换为 String 对象,那么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>); // 编译报错
p1 instanceof String不能通过编译,但p1 instanceof List却能通过编译,而instanceof List<Person>又不能通过编译了。关于这些问题,可以查看Java语言规范Java SE8版寻找答案,如图所示。
可以理解成以下代码:
在 T 不为 null 和 obj 不为 null 时,如果 obj 可以转换为 T 而不引发异常(ClassCastException),则该表达式值为 true ,否则值为 false 。所以对于上面提出的问题就很好理解了,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;
}
}
p1 instanceof String会编译报错,是因为(String)p1是不能通过编译的,而(List)p1可以通过编译。instanceof 也经常和三目(条件)运算符一起使用,代码如下:
A instanceof B ? A : C
判断 A 是否可以转换为 B ,如果可以转换返回 A ,不可以转换则返回 C。下面通过一个例子来讲解,代码如下:以上代码中,我们声明了一个 Animal 类作为父类,Cow 类和 Sheep 类为 Animal 的子类,在 Test 类的 main 函数中创建类 Sheep 的对象作为形参传递到 animalCall 方法中,因为 Sheep 类的对象不能转换为 Cow 类型,所以输出结果为“这个动物不是牛!”。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 {
}
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 风儿(风儿轻轻的吹)
- 儿童教育文章(儿童教育)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 冰客(冰客果汁)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 充值卡代理(充值卡代理加盟)
- 拆奶罩
- 郭妮小说(恶魔的法则郭妮小说)
- 东天目山(东天目山景区)
- 大松电饭煲(美的大松电饭煲)
- 疯狂填字(疯狂填字5)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 骇客神条(骇客神条怎么辨别真假)
- 杜星霖(杜星霖图片)
- 查传倜(查传倜个人生活)
- 广州晓港公园(广州晓港公园正门图片)
- 钢筋等级符号(钢筋等级符号电脑怎么输入)
- 广州中山大学(广州中山大学录取分数线2023)
