marcoc 发表于 2018-8-17 10:27:10

Selenium Web Driver自动化测试(java版)系列上半部分(2) - java变量和类型转换(2)

[图片上的字如果看不清楚请点击放大]上篇说了,这些变量类型都是"看上去的",因为某些情况下你不指定计算机是不懂的。来看这个例子:
https://upload-images.jianshu.io/upload_images/3310600-600c2a4ea62269af?imageMogr2/auto-orient/strip%7CimageView2/2/w/580
https://upload-images.jianshu.io/upload_images/3310600-9351a99f7d777310?imageMogr2/auto-orient/strip%7CimageView2/2/w/677
发现了吧?他们打印出来的都是5,光从终端并看不出有任何不同。但实际上一个是整型,一个是字符型。有人说怎么5还可以当字符型?别急,看我再改一下:
https://upload-images.jianshu.io/upload_images/3310600-f83a98efadb796bc?imageMogr2/auto-orient/strip%7CimageView2/2/w/580
我把c = 'a'改成c = 65。有人说你这不是字符型变量么?怎么能存个整数呢?这肯定有错误。咱们先别急着下结论,打印下试试:
https://upload-images.jianshu.io/upload_images/3310600-4b078a470ffc0314?imageMogr2/auto-orient/strip%7CimageView2/2/w/678
我们惊奇地发现程序没报错,还打印出来个A。为什么呢?因为它打印出来的是这个十进制数65所对应的字符。点击(http://www.asciitable.com)网站,我觉得没毒。上面有好多十进制,二进制,十六进制还有一些字符,我们可以看到65对应的是A。这些对应字符的数叫作ASC码。咱们不用深究这个ASC码是什么,只要记住它就是用来表示字符的二进制十进制十六进制的一个数就行了。
https://upload-images.jianshu.io/upload_images/3310600-3bc4b663f2d2d466?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
那这么说这个65就真的是个数啰。确实,现在出现了一个很有意思的现象:等号左边是字符类型的,等号后边是一个数,回到刚才的问题,怎么能把一个数赋给一个字符呢?在java中,这个是可以被允许的,因为变量的类型是可以转换的,刚才演示的就是一个简单的把整型转成字符的例子。我们再来看看其它的。
比如整型和浮点型相互转换:int <-> float
https://upload-images.jianshu.io/upload_images/3310600-a9f56269f99f17e6?imageMogr2/auto-orient/strip%7CimageView2/2/w/580
重新编译执行一下,f = 10.0。因为f是单精度浮点型,要用小数表示:
https://upload-images.jianshu.io/upload_images/3310600-6c629fef6f224170?imageMogr2/auto-orient/strip%7CimageView2/2/w/678
那我要是想反过来呢?多加几行代码:
https://upload-images.jianshu.io/upload_images/3310600-08268fda83a99713?imageMogr2/auto-orient/strip%7CimageView2/2/w/581
我们发现程序在a = f那行报错了:
https://upload-images.jianshu.io/upload_images/3310600-c13c60a8b0ae4a45?imageMogr2/auto-orient/strip%7CimageView2/2/w/676
错误信息的意思是从float转成int可能会丢精度。看清楚了吧,整型可以转成浮点型,但反过来就不行了。为什么会这样?因为我们看到的这种转换方式在java里被称为自动转换,而自动转换是隐形的。也就是你不用控制它,它自己转。自动转换需要遵循一个原则:只能是低精度转成高精度,而高精度不能自动转成低精度。精度高低的顺序我已经给大家总结出来了,从低到高依次是byte,short,int,long,float,double,你要是想自动转换必须遵循这个原则。所以int整型可以转成float浮点型,但反过来就不行。另外,布尔型就俩值true和false,asc码也变不成数,不用考虑。
https://upload-images.jianshu.io/upload_images/3310600-417455c2b3f1a57b?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
咱们再举个例子:
https://upload-images.jianshu.io/upload_images/3310600-11dd20c249301f04?imageMogr2/auto-orient/strip%7CimageView2/2/w/579
编译执行一下,会发现又报错了,还是一样的错误原因 - 可能会丢精度。有些人要抓狂了,说没毛病啊,float是浮点型,3.4是个小数,怎么就丢精度呢?先消消气,java规定,单精度浮点型变量的值后面要加个f,双精度则不用。这也是float和double在声明时的区别。你如果在3.4后面不写f,就意味着3.4是一个double类型的值,而按照自动转换原则double类型不能直接转换成float类型,所以就报错了。看看吧,防不胜防。把3.4后面补个f,程序通过。


那如果我就想把高精度转成低精度可不可以?没问题,但必须使用强制转换。比如下面这个例子:
https://upload-images.jianshu.io/upload_images/3310600-c874b4e32b0acba6?imageMogr2/auto-orient/strip%7CimageView2/2/w/580
我这里把f前面加一个(int),我们再执行一下,发现这次没问题了,a = 3:
https://upload-images.jianshu.io/upload_images/3310600-7776d468eecbd490?imageMogr2/auto-orient/strip%7CimageView2/2/w/676
但我们同时也发现原来的3.4赋给a后损失了一些精度。对吧?没办法,因为你是把一个高精度强制转成低精度,必然要付出代价。
https://upload-images.jianshu.io/upload_images/3310600-2a6e1fab8b9d34c3?imageMogr2/auto-orient/strip%7CimageView2/2/w/700
好了,这就是java变量和类型转换的基本概念。没事声明几个变量打印出来看看,多动手。下篇文章我们介绍(http://localhost:4000/2016/03/24/selenium/java/3-java-operators/)。

本篇知识点及注意事项:
1. 变量必须声明才能使用,并且给变量赋值后才能打印;
2. 变量之间可以进行类型转换,低精度可以通过自动转换转成高精度,但高精度必须进行强制转换才能转成低精度。


页: [1]
查看完整版本: Selenium Web Driver自动化测试(java版)系列上半部分(2) - java变量和类型转换(2)