![Java王者归来:从入门迈向高手](https://wfqqreader-1252317822.image.myqcloud.com/cover/394/27563394/b_27563394.jpg)
4-8 数据类型的转换
设计Java语言时,常常会碰上不同数据类型转换的问题,有些Java编译程序会处理,有些则需要自行处理,这将是本节的重点。
4-8-1 指定运算符自动数据类型的转换
程序设计时常看到如下表达式:
variable=operand
1.宽化类型转换
如果左边变量操作数的数据类型数值范围较广,则右边的操作数会被自动转成左边的变量操作数数据类型。
程序实例ch4_33.java:左边变量操作数的数据类型数值范围较广的应用。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_757951.jpg?sign=1739532102-eqU2pUiQGxKDmZQeNqIkwxtxeASM1W6m-0-7246efbab9232563351f71522480579c)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_757952.jpg?sign=1739532102-K3STzR6ZSt55J7GrBu5Ki4j7T9FWGaYu-0-8e9a63094973a5ba6ebba7046a3c6157)
2.窄化类型转换
如果左边变量操作数的数据类型数值范围较窄,而右边的操作数会被自动转成左边的变量操作数数据类型,但是必须符合右边的操作数结果是在左边类型数据的变量范围之内。
程序实例ch4_34.java:左边变量操作数的数据类型数值范围较窄的应用。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_757953.jpg?sign=1739532102-vuIOIbK3j1dqeILh3WRnFLeHiSwerM8z-0-b8bc65e86c3d5366d31a2d5f6a8c5839)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_757954.jpg?sign=1739532102-SYw6PMWwoaiEHFSaEUBu3taNr20ciobm-0-fde93e5fe32c084f26fc12d5c18236de)
3.常见的错误
如果右边操作数的值超出左边变量数据类型的范围,则在编译时会看到下列错误(意义是可能有损精确度)。
错误:不兼容的类型:从XXX转换到XXX可能会有丢失。
程序实例ch4_35.java:常见的程序错误范例。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_758010.jpg?sign=1739532102-qv5OrJuQDJGaZVhJ3gzzPD5R07jGjeWF-0-bf32066275999047ff89d7324c9b8491)
这个程序可以看到5个错误,第6行错误消息如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_532439.jpg?sign=1739532102-TKQK3vCG66F8DCFoGtSZPtoriH0bUbDs-0-30f5f122f12a362ceea49a95d903c3ea)
因为byte的整数范围是-128~127,300超出范围所以错误。第8行错误消息如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P59_532442.jpg?sign=1739532102-ILlEDwsEMEqCoEhLPhf8s7CwT8XPPUlZ-0-85b261f0d1ae1fe96e5470302626792d)
如果将0b11111111数值当作是byte,则这是-1,理论上语法正确。可是在3-2-1节讲过,Java会将所有整数设为int数据类型,所以0b11111111会被Java编译程序视为255,所以超出byte的范围,这也是在程序实例ch4_22.java及多个程序范例的应用中在设置二进制负值的byte时,增加(byte)强制类型转换的目的,4-8-3节还会介绍强制类型转换。第10、12、14行错误消息分别如下:
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P60_763177.jpg?sign=1739532102-agH16oxMxgccHGfgjeOM1QFDH15Q315b-0-2db37bae968940847027cac6dc2eab17)
由于double数据类型的值3.5超出byte、int、float的范围所以分别出现上述错误。
4-8-2 自动数据类型的转换
在程序设计时常看到如下表达式。
operand operator operand
如果上述左边operand和右边operand的数据类型不同,Java编译程序会自动依下列规则执行数据类型的转换。
(1)如果有一个operand的数据类型是double,则将另一个operand数据类型也转成double。
(2)否则,如果有一个operand的数据类型是float,则将另一个operand数据类型也转成float。
(3)否则,如果有一个operand的数据类型是long,则将另一个operand数据类型也转成long。
(4)如果以上都不符合,则将两个operand转成int。
程序实例ch4_36.java:自动数据类型转换的应用。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P60_532850.jpg?sign=1739532102-yBXab5dVdDZh3o29VHEMA5NKZBczotDz-0-ee7683b4e10b8c26218edf68da9ae488)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P60_532856.jpg?sign=1739532102-8XTGJNrlxcjOzw2QnhwJOShTi38FL21g-0-918a112fc9b2a55a11d4cf359da5a821)
程序实例ch4_37.java:常见的错误1。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P60_532859.jpg?sign=1739532102-yOlZUcqVy2CTwCWJ5AM7DEAsc51oetDt-0-f73e614c5dfde50077796c870e3c876a)
根据规则4,两个operand将转成int,但是左边变量是short所以上述程序将产生下列错误。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P60_532862.jpg?sign=1739532102-eaxsXeeNB1VQiiFlYFwBBIjJcmyg2jEM-0-d4c127bf970204e7a306ca4d29363a44)
程序实例ch4_38.java:常见的错误2。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_758019.jpg?sign=1739532102-UGAg8R1S6is4DaQSYWIFJcAFz9ShyJUv-0-59ca9a4292c052d4cf873d65cced56e1)
上述第6行10.0是double,所以a会被提升至double,所以计算结果是double数据类型,但是左边的x是float数据类型,所以将产生下列错误。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533272.jpg?sign=1739532102-5Wx5ZBdBmPzXBkiHKKrtTQuIGp5FKn6m-0-12e82071a1f84581a82378c17f430989)
4-8-3 强制数据类型的转换
其实从ch4_22.java起就用了这个概念,这相当于强制转换数据类型,若是简化ch4_22.java,改写成ch4_39.java,如下。
程序实例ch4_39.java:强制转换数据类型的应用。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533278.jpg?sign=1739532102-eMMGXQjWWG68Vz3mknBYg3clkOM60x77-0-d1bf7d82c081db4582ab8cd4e178d0e8)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533284.jpg?sign=1739532102-lSYdTOUZpsTx5cW5OVpJ1yMmwTdwu7e3-0-a0ca6eb30c4038ef56a819e5ce48905c)
上述程序第4行的(byte)就是强制将整数0b11111111转成byte数据,所以可以顺利执行。
程序实例ch4_40.java:修订ch4_38.java的错误,第6行将10.0强制改为10.0F,相当于将double改为float。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533287.jpg?sign=1739532102-iOglNJ6HTvPMQzYySdSFncyary9VGyfh-0-535dbe92c1dbb5c6177bc52ef5f9b136)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533288.jpg?sign=1739532102-RcZ5vU3yjgANZdhEob8aK6DMr5pI89Qn-0-6ef2d542b1ee8e8b12e1f2dfc965a3c3)
强制转型需留意的错误,可参考下列实例。
程序实例ch4_41.java:强制转型产生的错误。下列程序第5行int数据x值是128,在程序第7行将x强制转型为byte时,结果x值0b10000000被byte解读为-128。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533296.jpg?sign=1739532102-KlzpTASYFUNnrCG7dJCirkUNYwxro2DI-0-a8dd62384a5900c3d3005c3f4dbb0933)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P61_533302.jpg?sign=1739532102-tNLcPlEdRitnoq04rWFm9TM0jM7qDjlw-0-295fa183bf00f19e7455f274b151562f)