instanceof运算符与引用变量的强制类型转换
2019-09-17 10:30:26来源:博客园 阅读 ()
instanceof运算符与引用变量的强制类型转换
一、instanceof运算符
instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例该运算符返回boolean类型的数据。
常见的用法为:result=object instanceof class。如果object是clas的一个实例,那么instanceof运算符返回true;如果object不是class的一个实例,或者object是null,那么instanceof运算符返回false。
在使用instanceof运算符时需要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。下面的程序示范了instanceof运算符的用法。
public class InstanceofTest { public static void main(String[] args) { //声明hello时使用Object类,则hello的编译类型是Object //Object是所有类的父类,但hello变量的实际类型是String Object hello = "hello"; //String与Object类存在继承关系,可以进行instanceof运算,返回true System.out.println("字符串是否是Object类的实例:"+(hello instanceof Object)); System.out.println("字符串是否是String类的实例:"+(hello instanceof String)); //Math与Object类存在继承关系,可以进行instanceof运算,返回false System.out.println("字符串是否是Math类的实例:"+(hello instanceof Math)); //String类实现了Comparable接口,所以返回true System.out.println("字符串是否是Comparable类的实例:"+(hello instanceof Comparable)); String a = "hello"; //String与Math类没有继承关系,所以下面代码编译无法通过 System.out.println("字符串是否是Math类的实例:"+(a instanceof Math)); } }
上面程序通过Object hello = "hello";代码定义了一个hello变量,这个变量的编译时类型是Object类,但实际类型是String。因为Object类是所有类、接口的父类,因此可以执行hello instanceof String和hello instanceof Math等。
但如果使用String a = "hello";代码定义的变量a,就不能执行a instanceof Math,因为a的编译类型是String,String类型既不是Math类型也不是Math类型的父类,所以这行代码编译就会出错。
instanceof运算符的作用是:在进行强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功转换,从而保证代码更加健壮。
二、引用变量的强制类型转换
编写java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用的对象确实包含该方法。如果需要让这个引用变量调用它运行时类型的方法,则必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符。
类型转换运算符是小括号,其用法是:(type)variable,这种用法可以将variable变量转换成一个type类型的变量。除此之外,这个类型转换运算符还可以将一个引用类型变量转换成其子类类型。但这种强制类型转换不是万能的,需要注意以下两点:
1)基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括整型、字符型和浮点型。但数值类型和布尔类型之间不能进行类型转换。
2)引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时会出现错误。
下面是进行强制类型转换的示范程序,说明了哪些情况可以进行类型转换,哪些情况不可以进行类型转换。
public class ConversionTest { public static void main(String[] args) { double d = 13.4; long l = (long)d; System.out.println(l); int in = 5; //boolean b = (boolean)in;//编译出错 Object obj = "hello"; String str = (String)obj;//运行通过 System.out.println(str); Object objPri = new Integer(5); String s = (String)objPri;//引发ClassCastException异常 } }
考虑到进行强制类型转换时可能出现异常,因此进行类型转换之前应先通过instanceof运算符来判断是否可以成功转换,例如上面的String s = (String)objPri,为了让程序更加健壮,可以将代码改为以下:
if(objPri instanceof String) { String s = (String)objPri; }
instanceof和(type)是java提供的两个相关的运算符,通常先用instanceof判断一个对象是否可以强制类型转换,然后再使用(type)运算符进行强制类型转换,从而保证程序不会出现错误。
欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!
▼微信扫一扫下图↓↓↓二维码关注
原文链接:https://www.cnblogs.com/bingyimeiling/p/11508783.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 学习笔记之方法引用 2020-06-06
- 接口 2020-06-01
- 位运算符 2020-05-26
- JDK1.8新特性之(二)--方法引用 2020-05-21
- 总结Java中的reference类型与四种引用类型 2020-05-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash