Java基本数据类型转换时的一些小坑——自动类型转换、强制类型转换

11 篇文章 0 订阅

写Java算是很久了,正好最近重新捡起Java的基本知识看看发现很多东西竟然都要忘掉了,特意记录一下吧。

一、Java的基本数据类型(4类8种)

1. 四大类

(1)整型:byte、short、int(默认)、long
(2)浮点型:float、double(默认)
(3)字符型:char
(4)布尔型:boolean

2. 八种类型

数据类型关键字内存占用取值范围
字节型byte1个字节-128~127
短整型short2个字节-32768~32767
整型int(默认)4个字节 − 2 31 -2^{31} 231 ~ 2 31 − 1 2^{31}-1 2311
长整型long8个字节 − 2 63 -2^{63} 263 ~ 2 63 − 1 2^{63}-1 2631
单精度浮点数float4个字节1.4013E-45~3.4028E+38
双精度浮点数double(默认)8个字节4.9E-324~1.7977E+308
字符型char2个字节0~65535
布尔类型boolean1个字节true,false

建议:

  • long类型:数据后加L或l表示
  • float类型:数据后加F或f表示

二、两个经典的数据类型转换例子(经典面试题)

1. +=运算符的数据类型转换

先看第一个例子

short s = 1;
s = s + 1; // 编译失败
s = (short)(s + 1); // 编译成功

我们知道Java种整型的默认类型为int,因此s+1中的1为int型。当一个short类型与int类型相加,会进行隐式类型转换,将结果从short型提升为int型。之后再将int型赋值给short类型变量就会报错,需要强制类型转换。

short s = 1;
s += 1; // 编译成功
System.out.println(s);

s+=1虽然逻辑上等同于s=s+1,但其仍然是一个运算符。这里存在如下规则

  • 运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。

+=、-=、*=、/=、%=均适用这个规则

2. 常量与变量的数据类型转换

看这样一个例子

byte b1 = 1;
byte b2 = 2;
byte b3 = 1 + 2; // 编译成功
byte b4 = b1 + b2; // 编译失败
System.out.println(b3);
System.out.println(b4);

此处b3 = 1 + 2不报错的原因是因为1和2是常量,在编译的时候就已经执行了+运算符,并且确定了1+2的结果没有超过byte类型的取值范围,因此它的效果等同于b3=3。
而在b4=b1+b2中,b1和b2是变量,变量的值是可以变化的,编译时编译器javac不确定b1+b2的结果,因此会把结果以默认的int来进行处理,而int型不能赋值给byte型,所以编译失败。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值