|
现实世界中的数据不仅非常丰富,而且可以大致归为几类。例如,在人们的直觉中,数字和日期就不不同类的数据,因为它们的运算规则不一样。 例如,“2008年8月16日”和简单的数字“10”显然不一样,数字可以加减乘除,而日期呢?两个日期相加,例如“2008年8月16日”加上“2008年8月15日”是什么?有什么意义?难道是“4016年16月31日”?是否还要经过进一步换算得到一个合法日期?当然,两个日期相减还是有意义的,可以理解为这两个日期的天数之差,例如“2008年8月16日”减去“2008年8月15日”,结果是1,说明它们差1天。但两个日期相乘除,意义就更难理解了。 再看看表示信息的字符型数据,例如人的姓名或简历。作为字符串,“张三”怎么和“李四”进行四则运算? 所以,当把现实世界中的这些数据在计算机中表示时,必须把它们事先归类,不同类型的数据,运算规则也不一样。
在Java中,有八大基本数据类型,称为“原数据类型”,它们是由Java语言预先定义的,并由保留字命名。Java的八种原数据类型是: 1.byte(字节型)。byte数据类型是一个8位(bit)的有符号整数,范围是-128~127。在使用大数组时,为了节约内存,使用byte类型是个好方法。当数值比较小时,byte类型还可以代替int。 byte是用来处理未经加工的二进制数据的数据类型。 2.short(短整型)。short类型是一个16位的有符号整数,范围是-32,768~32,767。 3.int(整型)。int类型是一个32位的有符号整数,范围是-2,147,483,648~2,147,483,647。声明变量为整数时,一般声明为int型,因为在一般情况下它足够大了。除非有某些特殊原因(节约内存,数值范围确实不大等),才会使用short或byte型。当然,如果觉得它的范围还不够大,可以使用long型。 4.long(长整型)。long类型是一个64位的有符号整数,范围是-9,223,372,036,854,775,808~9,223,372,036,854,775,807。 5.float(浮点型)。float类型是32位单精度、符合IEEE 754规范的浮点数。对于负数,其范围为-3.402823×1038~-1.401298×10-45;对于正数,其范围为1.401298×10-45到3.402823×1038。因此可以存储带小数的、范围更大的数。但是,此数类型绝不能用于存储精确值,例如货币数量。 6.double(双精度型)。double类型是64位双精度、符合IEEE 754规范的浮点数。对于负数,其范围为 -1.79769313486232×10308到-4.94065645841247×10-324;对于正数,其范围为4.94065645841247×10-324到1.79769313486232×10308。对于数值型数据,double类型是默认选择。同样,这种数据类型绝不能用于存储精确值。 7.boolean(布尔型)。boolean型只有两个值:true(真)和false(假)。它是逻辑型数据,在内存中只用1位存储信息。 8.char(字符型)。char类型是一个单个的16位Unicode字符,最小值是'\u0000'(或0),最大值是'\uffff'(或65,535)。 Java的char类型比其他语言有较大的改进。C语言等的字符类型是采用ASCII编码,每个书占用8bit的长度,因此一共有256个不同的字符,字符'A'对应的ASCII码是65。这个表示范围太小了,所以Java的char类型采用16位Unicode编码方案,因此一共有65536个不同的字符,处理多语种的能力大大加强。 这八种数据类型如下表所示。
| 数据类型 | 关键字 | 占用位数(bit) | 取值范围 |
| 布尔型 | boolean | 8 | true, false |
| 字节型 | byte | 8 | -128~127 |
| 字符型 | char | 16 | '\u0000'~'\uffff' |
| 短整型 | short | 16 | -32768~32767 |
| 整型 | int | 32 | -2,147,483,648~2,147,483,647 |
| 长整型 | long | 64 | -9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
| 浮点型 | float | 32 | -3.402823×1038~-1.401298×10-45, 1.401298×10-45~3.402823×1038 |
| 双精度型 | double | 64 | -1.79769313486232×10308 ~-4.94065645841247×10-324, 4.94065645841247×10-324 ~1.79769313486232×10308
|
IEEE 754规范是国际上的一个标准规范,它规定了如何用一定位数的比特来存储实数,有兴趣的读者可以好好看看这篇文档:IEEE 754规范。
需要说明的是,上面八种数据类型是Java的基本数据类型。Java中还存在一种引用(reference)数据类型。例如,对应基本的double类型,在Java基础类库中还存在着一个类Double,对应基本的char类型,还存在一个类Character。这些类在包含基本数据类型的同时,还包含了一些对该数据类型操作的常用方法,例如把字符串转换成double型数值等。这些以后再讲。
为什么存在两种数据类型呢? 实际上,一种严格的面向对象的语言,是不应该有基本数据类型存在的。也就是说,它的所有成分都应该是与类或对象有关的。所以一个严格的面向对象的语言,在使用一个double型的数据前,应该建立Double类的对象。但事实上,因为这些简单数据类型应用得实在太广泛,为了简化编程,Java中就定义了与面向过程语言类似的基本数据类型,它们与类和对象无关。 从这个意义上说,Java仍然保留了面向过程语言的一些东西,因此它并不是严格意义上的完全面向对象的语言。
除了这八种原数据类型,Java还通过java.lang.String类,提供了对字符串的特殊支持。把字符串用双引号括起来,就会自动创建字符串对象。例如:
String s = "this is a string";
String对象是不可变的(immutable),即它一旦创建,它的值就不能改变。String类并不是原数据类型,但考虑到Java对它的特殊支持,你可以认为它也是一种原数据类型。在今后讲解简单数据对象(Simple Data Objects)时,将会学习更多的关于String类的知识。
上一篇:2.1 Java程序的基本构成 下一篇:2.2.2 标识符
|