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

摘要

在这篇文章中,我会结合自己遇到的疑惑,分析题目中的问题,并简要总结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语言级知识博大精深,上述有不准确之处,欢迎评论区留言。另,码字不易,如果觉得对您有帮助,记得点赞或者送火箭哦(·

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值