技术干货程序员

JVM系列:(二)Java基本数据类型

2019-01-17  本文已影响40人  8b6370ea271c

原文链接:JVM系列:(二)Java基本数据类型


一 Java 变量类型

1.1 图解

Java数据类型

1.2 描述

Java中的变量可以分为两大类:

二 基本类型

类型 值域 默认值
boolean {false, true} false
byte [-128, 127] 0
short [-32768, 32767] 0
char [0, 65535] '\u0000'
int [-2^31, 2^31 - 1] 0
long [-2^63, 2^63 - 1] 0L
float ~[-3.4E38, 3.4E38] +0.0F
double ~[-1.8E308, 1.8E308] +0.0D

Java的基本类型都有对应的值域和默认值。可以看到byte、short、int、long、float以及double的值域依次扩大,而且前面的值域被后面的值域所包含。因此:

byte b = 1;     // [-128, 127]
short s = 2;    // [-32768, 32767]
int i = 3;      // [-2^31, 2^31 - 1]
long l = 4;     // [-2^63, 2^63 - 1]
float f = 5F;   // ~[-3.4E38, 3.4E38]
double d = 6D;  // ~[-1.8E308, 1.8E308]

System.out.println("b=" + b + ", s=" + s + ", i=" + i + ", l=" + l + ", f=" + f + ", d=" + d);
// b=1, s=2, i=3, l=4, f=5.0, d=6.0

// 小值域 转 大值域 不需要强制类型转换
d = f = l = i = s = b;

System.out.println("b=" + b + ", s=" + s + ", i=" + i + ", l=" + l + ", f=" + f + ", d=" + d);
// b=1, s=1, i=1, l=1, f=1.0, d=1.0

byte b = 1;     // [-128, 127]
short s = 2;    // [-32768, 32767]
int i = 3;      // [-2^31, 2^31 - 1]
long l = 4;     // [-2^63, 2^63 - 1]
float f = 5F;   // ~[-3.4E38, 3.4E38]
double d = 6D;  // ~[-1.8E308, 1.8E308]

// 大值域 转 小值域 需要强制类型转换
b = (byte) s;
s = (short) i;
i = (int) l;
l = (long) f;
f = (float) d;

System.out.println("b=" + b + ", s=" + s + ", i=" + i + ", l=" + l + ", f=" + f + ", d=" + d);
// b=2, s=3, i=4, l=5, f=6.0, d=6.0

强制转换时:小值域的值 = - (小值域的范围值 - |大值域的值|)

// 大值域的值 超出 小值域的值域范围
s = 138;
b = (byte) s; // b = -118 = - (256 - |138|)

System.out.println("b=" + b + ", s=" + s);
// b=-118, s=138

三 特殊的boolean类型

另外一点需要注意的是,尽管这八个基本类型的的默认值看起来不同,但是在内存中都是0。

到这里可能会有同学存在疑问了,boolean类型在内存中保存的默认值也是0吗?答案是是的!

boolean类型在Java里的可选值是true或false,默认值是false。为什么我们在写Java代码的时候不能直接将0或1赋值给boolean类型的变量呢?因为Java编译器对此进行了校验,不容许我们这样写,但是JVM对 .class 字节码文件的要求规范并没有这方面的限制。

boolean类型Java值 JVM内存中的值
true 1
false 0

熟悉JavaScript的同学应该都知道下面这段代码是有输出的:

if (-1 && 1 && "1" && "2" && true) {
    console.info("我会输出内容")
}
if (!0 && !false) {
    console.info("我也会输出")
}

对这段代码存在疑问的同学可以把它复制到浏览器的控制台执行一下,执行结果如下:

JavaScript对boolean类型的支持

从以上结果也可以看出,false对应到内存中的值是0,其余非0且非空值都作为true处理,JVM处理boolean类型也是如此。


接下来我们将介绍:


扫码关注有惊喜
上一篇下一篇

猜你喜欢

热点阅读