提到java原始数据类型,可能很多java程序员都觉得很简单,可是你真的对java原始数据类型很了解吗?好像不一定,我相信下面的一些程序即使有过很长开发经验的程序员也不一定能解释的很清楚。当然,我也依然在学习的过程中,有什么地方解释的不正确欢迎指正。
先来个简单的小例子:
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
}
}
上面的例子很简单,就是对一个short类型变量s赋初值。但是为什么没有任何错误呢?常量值2不应该是int类型的吗?把int类型的 值转换成short类型的值不是应该强制转换的吗?为什么把int类型的值转换成short类型的值没有任何错误呢?下面是这部分代码的字节码:
public com.ygc.PrimitiveDataTypeTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: return
}
可以看到,字节码中只调用了iconst_2(把2压入栈顶)和istore_1(把栈顶的内容存入s中)。因为赋值过程中只存在int类型的常量值,所以编译器知道如何处理。(这部分我也不是很清楚啊,还请大侠帮忙解释一下。)
下面再来看一段代码:
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
s = (short) (s + 1);
}
}
上面的代码中在计算 s的值时必须对结果进行强制类型转换,而如果写成下面这样则会出现编译错误:
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
s = s + 1;
}
}
这是因为+操作符有两个操作数,JVM指令中+操作符的最小类型是int,其它的byte、short、char都以iload,iadd来操作,然后用i2b,i2s,i2c转换回去,因为+操作在两个数中间,所以如果不手动转换,编译器根本不知道你要转换成第一个操作数类型还是第二个操作数类型。这段代码的字节码如下:
Compiled from "PrimitiveDataTypeTest.java"
public class com.ygc.PrimitiveDataTypeTest extends java.lang.Object{
public com.ygc.PrimitiveDataTypeTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: i2s
6: istore_1
7: return
}
而下面的代码却是可以正确执行的,不需要强制类型转换:
public class PrimitiveDataTypeTest {
public static void main(String[] args) {
short s = 2;
s += 1;
}
}
通过查看它的字节码发现,编译器自动执行了类型转换:
Compiled from "PrimitiveDataTypeTest.java"
public class com.ygc.PrimitiveDataTypeTest extends java.lang.Object{
public com.ygc.PrimitiveDataTypeTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: i2s
6: istore_1
7: return
}
所以说看似简单的原始数据类型并不简单,还需潜心研究。上面的描述还不是很详细,因为我也是刚刚开始这方面的研究,以后还会不断完善。如有哪里不对,还请多多指教。