Java中的instanceof关键字
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的instanceof关键字,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4105字,纯文字阅读大概需要6分钟。
内容图文
![Java中的instanceof关键字](/upload/InfoBanner/zyjiaocheng/1098/aae157f072ff4249a4ed9c4fdf50f219.jpg)
Java中,instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如
果是返回true,否则返回false。
也就是说:
使用instanceof关键字做判断时, instanceof 操作符的左右操作数必须有继承或实现关系
下面我们用继承树来判断instanceof的返回值:
1 package instanceofTest; 2 3 /** 4 * @author zsh 5 * @company wlgzs 6 * @create 2019-03-21 19:55 7 * @Describe 继承树来判断instanceof的返回值 8 */ 9 interface Man{} 10 class Person1 implements Man{} 11class Student extends Person1{} 12class Postgraduate extends Student {} 13class Animal {} 14publicclass Main1 { 15publicstaticvoid main(String[] args) { 16 System.out.println("Student 的对象是谁的实例?"); 17 instanceofTest(new Student()); 18 System.out.println("Animal 的对象是谁的实例?"); 19 instanceofTest(new Animal()); 20 System.out.println("Postgraduate 的对象是谁的实例?"); 21 instanceofTest(new Postgraduate()); 22//一个类的实例是这个类本身的实例,也是他父类,父类的父类的实例,也是实现的接口的实例23 } 2425publicstaticvoid instanceofTest(Object p) { 26if (p instanceof Animal) 27 System.out.println(p.getClass() + "类的实例 是类Animal的实例"); 28if (p instanceof Postgraduate) 29 System.out.println(p.getClass() + "类的实例 是类Postgraduate的实例"); 30if (p instanceof Student) 31 System.out.println(p.getClass() + "类的实例 是类Student的实例"); 32if (p instanceof Person1) 33 System.out.println(p.getClass() + "类的实例 是类Person的实例"); 34if (p instanceof Man) 35 System.out.println(p.getClass() + "类的实例 是接口Man的实例"); 36if (p instanceof Object) 37 System.out.println(p.getClass() + "类的实例 是类Object的实例"); 38 } 39 }
上面的程序,展示各类之间的关系的继承树是:
上述程序中:
由上面继承树可知,某个类(接口也可以看成一个特殊的类)的对象是不是其他类(或接口)的实例,只需按箭头方向,以此对象所在的类为起点到达此继承树分支(可能有多个分支)终点,沿途经过的类(包括本类,或接口)就都是该对象的实例。
所以输出结果是:
但是,要注意一点:
在判断某个类(接口也可以看成一个特殊的类)的对象是不是其他类(或接口)的实例,一定要首先进行向上转型,然后才可用instanceof关键字进行判断,这是基本操作规范。
如:
1 package instanceofTest; 2 3 /** 4 * @author zsh 5 * @company wlgzs 6 * @create 2019-03-21 20:02 7 * @Describe 8 */ 9 10 interface A{ 11 void say(); 12 } 13 14 class B implements A{ 15publicvoid say() 16 { 17 System.out.println("B实现的say()方法"); 18 } 19} 2021class C implements A{ 22publicvoid say() 23 { 24 System.out.println("C实现的say()方法"); 25 } 26} 2728publicclass Main2 { 29publicstaticvoid main(String[] args) { 30 A a= new B(); //接口不能new31 System.out.println(a instanceof B); //true;发生了A a= new B();32 System.out.println(a instanceof C); //false;没有发生A a = new C();33 } 34 }
运行结果:
以上各类的之间关系的继承树如下:
在判断接口A的对象a 是不是类C的实例时,没有先进行向上转型,就进行instanceof关键字的使用了,是肯定会返回false的。
测试用例:
1 package instanceofTest; 2 3 /** 4 * @author zsh 5 * @company wlgzs 6 * @create 2019-03-21 20:07 7 * @Describe instanceof 测试用例 8 */ 9 interface A{ 10 11 } 12 class B implements A{ 1314} 15class C extends B{ 1617} 18publicclass Main3 { 19publicstaticvoid main(String[] args) { 20 A ab=new B(); 21 A ac=new C(); 22 B bc=new C(); 23 B bb=new B(); 24 C cc=new C(); 25//对象实现一个接口,用这个对象和这个接口进行instanceof判断,都为true。26 System.out.println("ab instanceof A="+(ab instanceof A)); 27 System.out.println("ac instanceof A="+(ac instanceof A)); 28 System.out.println("bc instanceof A="+(bc instanceof A)); 29 System.out.println("bb instanceof A="+(bb instanceof A)); 30 System.out.println("cc instanceof A="+(cc instanceof A)); 31//对象和父类进行instanceof判断,都为true32 System.out.println("ab instanceof B="+(ab instanceof B)); 33 System.out.println("ac instanceof B="+(ac instanceof B)); 34 System.out.println("bc instanceof B="+(bc instanceof B)); 35 System.out.println("bb instanceof B="+(bb instanceof B)); 36 System.out.println("cc instanceof B="+(cc instanceof B)); 37//对象和他的子类进行instanceof判断为false38 System.out.println("ab instanceof C="+(ab instanceof C)); 39 System.out.println("ac instanceof C="+(ac instanceof C)); 40 System.out.println("bc instanceof C="+(bc instanceof C)); 41 System.out.println("bb instanceof C="+(bb instanceof C)); 42 System.out.println("cc instanceof C="+(cc instanceof C)); 43 } 44 }
运行结果:
总结:
如果一个类的实例是这个类本身的实例,那么它也是它的父类、它的父类的父类的实例,也是由它实现的接口的实例
且instanceof左边操作元显式声明的类型与右边操作元必须是同种类或右边是左边父类的继承关系
此外:
// false;这是instanceof 特 有 的 规 则 : 若左操作数为null, 结果就直接返回false, 不再运算右操作数是什么类。 boolean b5 = nullinstanceof String;
// 编译不通过;‘A‘在此处视为基本数据类型char,instanceof操作符只能用作对象的判断 boolean b4 = ‘A‘ instanceof Character;
原文:https://www.cnblogs.com/zsh-blogs/p/10574183.html
内容总结
以上是互联网集市为您收集整理的Java中的instanceof关键字全部内容,希望文章能够帮你解决Java中的instanceof关键字所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。