《编写高质量代码:改善Java程序的151个建议》 建议18
2014-11-02 00:13
162 查看
18. 避免instanceof非预期结果
instanceof是一个简单的二元操作符,它是用来判断一个对象是否是一个类的实例的,其操作类似于>=、==,非常简单,我们来看段程序:
"String" instanceof Object
返回true,”String“是字符串,字符串又继承自Object,那当然返回true了。
new String() instanceof String
返回true,没有任何问题。
new Object() instanceof String
返回false,Object是父类,其对象当然不是String类型的实例了。注意的是,这句话是可以编译通过的,只要instanceof关键字的左右两个操作数有继承或实现关系,就可以编译通过。
'A' instanceof Character
这句话编译不通过,因为'A'是一个char类型,是基本类型而不是对象,instanceof只能用于对象的判断,不能用于基本类型的判断。
null instanceof String
返回false,这是instanceof特有的规则:若左操作数是null,结果就直接返回false,不再运算右操作数是什么类。最对我们的程序非常有利,在使用instanceof操作符时,不用关系被判断的类是否为null,这与我们经常用到的equals、toString方法不同。
(String)null instanceof String
返回false,不要看这里有个强制转换就认为结果是true,不是的,null是一个万用类型,也可以说它没类型,即使做类型转换还是个null。
new Date() instanceof String
编译通不过,因为Date类和String类没有继承和实现关系。
new GenericClass<String>().isDateInstance("")
返回false,这句话是可以编译通过的,T是个String类型,与Date之间没有继承或者实现关系,为什么还会编译通过?那是因为Java的泛型是为编码服务的,在编译成字节码时,T已经是Object类型了,也就是说T表面是Object类型,实际是String类型,那"t instanceof Date"就等价于"Object instanceof Date",所以返回false很正常。
instanceof是一个简单的二元操作符,它是用来判断一个对象是否是一个类的实例的,其操作类似于>=、==,非常简单,我们来看段程序:
public class Client { public static void main(String[] args) { boolean b1 = "String" instanceof Object; boolean b2 = new String() instanceof String; boolean b3 = new Object() instanceof String; boolean b4 = 'A' instanceof Character; boolean b5 = null instanceof String; boolean b6 = (String)null instanceof String; boolean b7 = new Date() instanceof String; boolean b8 = new GenericClass<String>().isDateInstance(""); } class GenericClass<T>{ public boolean isDateInstance(T t){ return t instanceof Date; } } }这么一段程序,instanceof的所有应用场景都出现了,同时问题也产生了:这段程序中哪些语句会编译通不过?
"String" instanceof Object
返回true,”String“是字符串,字符串又继承自Object,那当然返回true了。
new String() instanceof String
返回true,没有任何问题。
new Object() instanceof String
返回false,Object是父类,其对象当然不是String类型的实例了。注意的是,这句话是可以编译通过的,只要instanceof关键字的左右两个操作数有继承或实现关系,就可以编译通过。
'A' instanceof Character
这句话编译不通过,因为'A'是一个char类型,是基本类型而不是对象,instanceof只能用于对象的判断,不能用于基本类型的判断。
null instanceof String
返回false,这是instanceof特有的规则:若左操作数是null,结果就直接返回false,不再运算右操作数是什么类。最对我们的程序非常有利,在使用instanceof操作符时,不用关系被判断的类是否为null,这与我们经常用到的equals、toString方法不同。
(String)null instanceof String
返回false,不要看这里有个强制转换就认为结果是true,不是的,null是一个万用类型,也可以说它没类型,即使做类型转换还是个null。
new Date() instanceof String
编译通不过,因为Date类和String类没有继承和实现关系。
new GenericClass<String>().isDateInstance("")
返回false,这句话是可以编译通过的,T是个String类型,与Date之间没有继承或者实现关系,为什么还会编译通过?那是因为Java的泛型是为编码服务的,在编译成字节码时,T已经是Object类型了,也就是说T表面是Object类型,实际是String类型,那"t instanceof Date"就等价于"Object instanceof Date",所以返回false很正常。
相关文章推荐
- 编写java程序151条建议读书笔记(18)
- 编写高质量代码改善C#程序的157个建议——建议18:foreach不能代替for
- 建议18:foreach不能代替for
- 改善C++ 程序的150个建议学习之建议18:正确区分void与void*
- AutoCAD 04,07,08,11,14,16,18不同版本的选择建议
- iOS应用性能调优的25个建议和技巧(18)
- 编写高质量OC代码52建议总结:18.尽量使用不可变对象
- asp.net 导出Excel时,解决纯数字字符串变成类似这样的 2.00908E+18 形式的代码
- 优秀的孩子是这样培养的(建议永久保存)
- 学习笔记---给Linux初学者的建议
- 改善Java Script程序的建议(二)
- javascript放在head和body的区别(w3c建议放在head标签中)
- 快乐的生活 2008-10-10 18:49:00
- 建议用json
- nodejs 编程建议(代码规范)
- 改善Java Script程序的建议(二)
- 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)
- 细品RibbonX(18):button控件详解
- 快速构建Windows 8风格应用18-基础控件I
- 程序员:远离亚健康的六点建议