美文网首页
浅谈java中: short s = s + 1和s += 1的

浅谈java中: short s = s + 1和s += 1的

作者: 进击的NULL | 来源:发表于2018-12-06 12:40 被阅读0次

    摘要

    在这篇文章中,我会结合自己遇到的疑惑,分析题目中的问题,并简要总结java中数据类型相关的知识,供交流学习。

    关键字

    java, 数据类型, 默认类型,运算符优先级、类型溢出

    正文

    不知读者们是否会像作者同样的以为:题目中两者没有啥区别!
    由于我们在平时的编程中很少涉及类型溢出、优先级考虑等问题,加上林林总总的数据类型、包装类、又是单目运算符,又是三元运算符,脑子都绕晕了,所以忽略了这类问题。。。
    作者最近涉及到要考虑性能、考虑存储细节才踩到这个坑。

    两者的区别

    short s = s + 1

    s = s + 1,在s + 1的时候,结果会被“升格”为int类型。将int高级类型转为低级类型,需要强制转换,所以自然编译不会通过.

    s += 1
    对于“+=”操作,jvm会自动执行类型操作,等价于 s = (short)(s + 1)

    说完两者的区别,作者进一步去看了一下造成这个区别的几点本质原因,总结如下。

    java数据类型

    在java中数据类型(byte, short, char) -> int ->long -> float -> double,从左到右低阶到高级,不同数据类型之间既有能表示范围的区别,同时由于java是强类型语言,所以严格按照(当然还有一些封装方法可以相互转换,这里不扩展,只介绍基本类型)以下规则转换:

    • 隐式转换
      低阶变量可以直接转换为高级变量,比如 byte b;int i = b;long l = b;float f = b;double d = b;是自动的。
    • 显示转换
      从高级变量转为低级变量,比如 int i = 99;byte b = (byte) i;char c = (char)i;float f = (float)i;需要程序员手动强制转换,但是要注意转换后可能丢失精度或者数据溢出

    java的默认类型

    在java中,整数 默认是 int 类型,小数 默认是 double 类型 ;因此,在一些地方会造成一些错误,除了上面s + 1中的“1”编译器默认为int类型之外,还有诸如:

    long num = 99999999999999; // error

    编译器也是会报错的!原因是编译器把99999999999999当成int类型,然而99999999999999超出了int能表示的范围,所以改成如下就好了:

    long num = 99999999999999L; // ok

    运算符优先级

    博大精深,无力展开,只说一点:赋值运算符“=”优先级最低,而“+=”运算符比较高,在解析s += 1的时候由于是“+=”操作符,编译器解析时先将其转换为 s = (short)(s + 1),更深层次涉及到jvm如何实现,这里可以自己去看一下。

    结尾

    java语言级知识博大精深,上述有不准确之处,欢迎评论区留言。另,码字不易,如果觉得对您有帮助,记得点赞或者送火箭哦(****·****)

    相关文章

      网友评论

          本文标题:浅谈java中: short s = s + 1和s += 1的

          本文链接:https://www.haomeiwen.com/subject/stnncqtx.html