原文链接: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类型也是如此。
接下来我们将介绍:
- .java 源码文件为什么要编译为 .class 字节码文件。
- 怎么将 .java 源码文件通过 javac 编译工具编译为 .class 字节码文件。
扫码关注有惊喜
网友评论