
1.12 Java基本的数据类型
Java语言一共提供了八种原始的数据类型(byte、short、int、long、float、double、char、boolean),这些数据类型不是对象,而是Java中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立刻在栈上分配内存空间。除了这八种基本的数据类型外,其他类型都是引用类型(例如类、接口、数组等),引用类型类似于C++中的引用或指针的概念,它以特殊的方式指向对象实体,这类变量在声明时不会被分配内存空间,只是存储了一个内存地址而已。
表1-1所展示的是Java中基本数据类型及其描述。
表1-1 不同数据类型对比

以上这些基本类型可以分为如下四种类型。
1)int长度数据类型:byte(8bits)、short(16bits)、int(32bits)、long(64bits)。
2)float长度数据类型:单精度(32bits float)、双精度(64bits double)。
3)boolean类型变量的取值:true、false。对于boolean占用空间的大小,从理论上讲,只需要1bit就够了,但在设计的时候为了考虑字节对齐等因素,一般会考虑使其占用一个字节。由于Java规范没有明确的规定,因此,不同的JVM可能会有不同的实现。
4)char数据类型:Unicode字符,16位。
此外,Java语言还提供了对这些原始数据类型的包装类(字符类型Character,布尔类型Boolean,数值类型Byte、Short、Integer、Long、Float、Double)。需要注意的是,Java中的数值类型都是有符号的,不存在无符号的数,它们的取值范围也是固定的,不会随着硬件环境或者操作系统的改变而改变。除了以上提到的八种基本数据类型以外,在Java语言中,还存在另外一种基本类型void,它也有对应的包装类java.lang.void,只是无法直接对它进行操作而已。包装类型和原始类型有许多不同点,首先,原始数据类型在传递参数的时候都是按值传递,而包装类型是按引用传递的。当包装类型和原始类型用作某个类的实例数据时所指定的默认值(默认初始化的时候会把对应内存中所有的位都设置为0),例如数字是0(包括byte、short、int、long等类型),boolean是false,浮点(包括float、double)是0.0f,引用是null。对象引用实例变量的默认值为null,而原始类型实例变量的默认值与它们的类型有关(如int默认初始化为0)。如下例所示:

程序运行结果为:

除了以上需要注意的内容外,在Java语言中,默认声明的小数是double类型的,因此在对float类型的变量进行初始化时需要进行类型转换。float类型有两种初始化方法:float f=1.0f或float f=(float)1.0。与此类似的是,在Java语言中,直接写的整型数字是int类型的,如果在给数据类型为long的变量直接赋值时,int类型的值无法表示一个非常大的数字,因此,在赋值的时候可以通过如下的方法来赋值:long l=26012402244L。
引申:
(1)在Java语言中null值是什么?在内存中null是什么?
null不是一个合法的Object实例,所以编译器并没有为其分配内存,它仅仅用于表明该引用目前没有指向任何对象。其实,与C语言类似,null是对引用变量的值全部置0。
(2)如何理解赋值语句String x=null?
在Java语言中,变量被分为两大类型:原始值(primitive)与引用值(reference)。声明为原始类型的变量,其存储的是实际的值。声明为引用类型的变量,存储的是实际对象的地址(指针,引用)。对于赋值语句String x=null,它定义了一个变量“x”,x中存放的是String引用,此处为null。