类型转换
在昨天呢,难度上来了,让大家体验了面试的感觉,那我们接着回归正题,今天学习类型转换
类型转换:分为两种,强制类型转换和自动类型转换
我们之前就学习到,Java是个强类型语言,所以要进行有些运算的时候,需要用到类型转换。
可以运算的类型有: byte,short,char,int,long,float,double,这些都是可以进行运算的单位,从字节大小排列,
从最小的byte,short,char,到最大的float,double,中间还有int,long,大师大家有没有发现一个问题,float 是32,但long是64,但为什么float排在long后面呢,因为小数的优先级一定大于整数,能理解吧?(反正我是理解不下来)
运算中,不同类型的数据先转化为同一类型,然后再进行运算
强制类型转换
听得懂吗?听不懂没关系,IDEA走起,新new个class文件,名为demo05,(不要问我为什么是05,不是04,视频是这样写的我就这样做了)然后一个main方法,定义一个int,和一个byte,byte=int,看看结果会怎么样
我们可以看到,int的i=128,然后把int的i给到了byte上
这种逻辑是没问题的吧,可要注意,运算中,不同类型的数据先转换同一类型然后再进行运算,这句话,
所以它报错说他要的是byte,却给他了int,这时候就需要我们强制转换把它转化成同一类型,
这时候很简单,想要把他们转换成同一类型只要在附值前面加上需要转化的类型就行了
这样是没有问题的那我们输出一下i和b,看看最终的运行结果
那我们看到的结果是不是感觉出问题了,为什么int是正常输出,但是到了byte输出的却变成了负数呢?
我们都学过,每个关键字都有能表达的数值,那byte能表达的最大数值是:负的128到正的127,所以它表示的数值溢出了自己的表达范围,,称:内存溢出,溢出了你也不知道它输出的会是什么,所以在转换的时候避免内存溢出的情况
一个概念,加了括号的这种是强制转换,格式就是:(类型) + 变量名
不过强制转换它也是有规则的,我们等下再聊,
自动类型转换
开头说过类型转换有分为强制类型转换和自动类型转换,刚才演示了强制类型转换,它是从高到底,从int转换到byte,而自动类型转换是相反的,从byte转换到int,
那自动转换的话是什么都不用写类名,因为从低到高的转换int就包含了byte的数,可以不用再去写要转换的类型,直接写上变量名就可以了
我们来演示一下,从double到int的自动转换
我们就可以看到,的出来的结果是没问题的,因为double是表示小数的关键字,所以是128.0
现在来讲一下注意点:
1.不能对布尔值进行转换
布尔值是表示是非对错的,不能表示数字
2.不能把对象类型转换为不相干的类型
你把表达字符的关键字让他表达数字,人家是男的你偏说人家是女的,这是不行的
3.在高容量转换到低容量的时候是强制转换
4.转换的时候可能存在内存溢出,或者精度问题
那什么是精度问题呢?我们演示一下,
我们先写两个强制转换,输出个int23.7 和 int45.89f,一个是double一个是float,从浮点数转换为整数试一试,
可以看到它直接把小数都省略了,这就存在精度问题,
那有人会问了,字符类型的char不是也可以表示数字,那我们去试一试,写个char=字母,在写个int+char,这里就强制转换了,看一下结果
我们可以看到是98,那为什么是98呢?回想一下我们昨天学的字符拓展里的Unicode,所有字符的本质还是数字,那么表示a的数字是97,所以97+1=98,那我们要让int的f转化为char要怎么弄呢,用刚才学的知识操作一下,
我们看一下结果会怎么样
刚才学的强制转换现在就可以用到了,可以看到在Unicode里98代表的是b,按照这个顺序就可以推算出小写的26字母都是什么编码了
常见的问题
讲完这些在给大家讲一些常见的问题,那为了区分就再创建一个class文件名为Demo06,
我们先看一下操作数值比较大的时候回遇到的溢出问题,先int个money,付个10亿的值,在写这10个亿的时候大家是不是很麻烦呀,每次要数好久,这里讲一下JDK7的新特性:在数字之间可以用下划线分割 “ _ ” 而且下划线是不会被输出的,我们来输出一下
这个下滑线是不会被输出的,输出出来还是1000000000,这个特性是为了我们更加方便区分,
那接下来,我们在加个年份,算一下20年一年赚10亿能赚到多少,是不是200亿呀,那我们将20和10亿相乘一下
得出来的结果是个负数,那为什么呢?因为200亿已经超出了int的范围,那有人就提出解决方法,直接把total的int换成long嘛,那我们来试一试
那为什么还是负数呢?因为前两个的关键字都是int,默认是int,经过计算以后才转换成long,在转换之前就已经存在问题了,
那我们通常是怎么解决的呢?可以知道这个years是20,在int里是正常的,我们只需要在money前面加上long,让它转换一下就没问题了,试一试吧
这次是没问题了,在操作前就把整个类型提升,这是我们比较常见的问题,
还有一个问题,一般我们在long这个关键字后面附的值是要加个**“ L "**的大写小写都可以,那这个L的小写在代码里面是不是很容易被看成1呀,那这里就要注意我们的代码规范了,最好是用这个大写的代码,不然就算你不会看错,别人也会看错,所以这些要从基础做起,