Java instanceof 运算符
周sir |
2015年3月30日 |
Java面向对象 |
0 条评论 | 1529
多态带来一个实际问题:变量声明类型是父类,怎么判断它实际引用的对象是哪一种?Java 用 instanceof 运算符。
obj instanceof Type 看的是对象的真实类型,不是变量的声明类型。真实对象是 Type 本身,或 Type 的子类,结果为 true。
一、继承链
class People {
}
class Teacher extends People {
}
class President extends Teacher {
}
链是 Object → People → Teacher → President。越往下越具体。
二、同一变量,两种实际对象
public class Demo {
public static void main(String[] args) {
People obj = new People();
if (obj instanceof Object) {
System.out.println("我是一个对象");
}
if (obj instanceof People) {
System.out.println("我是人类");
}
if (obj instanceof Teacher) {
System.out.println("我是一名教师");
}
if (obj instanceof President) {
System.out.println("我是校长");
}
System.out.println("-----------");
obj = new Teacher();
if (obj instanceof Object) {
System.out.println("我是一个对象");
}
if (obj instanceof People) {
System.out.println("我是人类");
}
if (obj instanceof Teacher) {
System.out.println("我是一名教师");
}
if (obj instanceof President) {
System.out.println("我是校长");
}
}
}
// 运行结果:
// 我是一个对象
// 我是人类
// -----------
// 我是一个对象
// 我是人类
// 我是一名教师
| 实际对象 |
instanceof Object / People |
instanceof Teacher / President |
| new People() |
true / true |
false / false |
| new Teacher() |
true / true |
true / false |
Teacher 是 People 的子类,所以 new Teacher() instanceof People 为 true;People 不是 Teacher,所以第一段不会打印「我是一名教师」。向下问更具体的类型,只有实际对象够「具体」才为 true。
一句话总结:instanceof 问的是堆上那个对象是不是某类型或其子类,不问变量写成了什么类型。
转载请注明来源:Java instanceof 运算符
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。