Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。
程序设计中总会考虑一些需要特殊对待的类型,特别是小的、简单的变量,若通过new 创建对象存储在堆里,不够有效,可以直接存储其“值”,并置于堆栈中。
在Java中,一共有8种基本类型,其中有4个整型、2个浮点型、1个字符型和1个用于表示真假值的boolean类型。除基本类型外,其它类型我们称之为类类型(即引用类型)。
整型
类型 | 存储需求 | 取值范围 |
byte | 1字节 | -128 ~ 127 |
short | 2字节 | -32768 ~ 32767 |
int | 4字节 | -2147483648 ~ 2147483647 |
long | 8字节 | -9223372036854775808 ~ 9223372036854775807 |
在java中,整型的范围与运行java代码的机器无关。这也正是体现了java的可移植性。这与C和C++不同。C和C++中,需要针对不同的处理器选择最为有效的整型。在8086这样的处理器上整型数值占2个字节,在Sun SPARC这样的处理器上,整型数值占4个字节;在Intel Pentium处理器上,C和C++整型依赖于具体的操作系统,也就是说,对于DOS和Windows3.1,整型占2个字节,当Windows程序使用32位模式时,整型占4个字节。在java中,所有数值类型所占据的字节数量与平台无关。
长整型数值有一个后缀L(如40000000000L)。十六进制数值有一个前缀0x(如0xCAFE)。八进制有一个前缀0。
浮点型
类型 | 存储需求 | 取值范围 |
float | 4字节 | 大约±3.40282347E+38F(有效位数为6~7位) |
double | 8字节 | 大约±1.79769313486231570E+308(有效位数为15位) |
double表示这种类型的数值精度是float类型的两倍。(有称之为双精度)绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。例如,用7位有效数字足以精确表示普通雇员的年薪,但表示公司总裁的年薪可能就不够用了。实际上,只有很少的情况适合使用float类型,例如,需要快速地处理单精度数据,或者需要存储大量数据。
float类型的数值有一个后缀F(例如,3.402F)。没有后缀F的浮点数值(如3.402)默认为double类型。当然,也可以在浮点数值后面添加后缀(例如,3.402D)。
在JDK5.0中,可以使用十六进制表示浮点数值。例如,0.125可以表示成0x1.0P-3。在十六进制表示法中,使用P表示指数,而不是E。
浮点数值不适用于禁止出现舍入误差的金融计算中。例如,命令System.out.println(2.0-1.1)将打印出0.8999999999999999,而不是人们希望的0.9。出现这种问题的主要原因在于浮点数值是采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10。这就好象十进制无法精确地表示1/3一样。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类。
char类型
在java中规定,字符型为16位(2字节)Unicode编码,字符型可以通过转换转成整数型或浮点型,实际上,可以把字符型变成十六位无符号整数使用,范围是\u0000到\uFFFF.整数的值是该字符Unicode编码。
在Java中,char类型用UTF-16编码描述一个代码单元。不建议在程序中使用char类型,最好将需要处理的字符串用抽象数据类型表示。
字符常量表示形式:
1)‘A’表示一个字符常量,编码值为65,与“A”完全不同,后者为包含字符A的字符串。
2)\u03C0 表示希腊字母π
3)特殊字符的转义字符。如下为转义字符表
转义序列 | 名称 | Unicode值 |
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\” | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
\XXX | \后跟随3位8进制整数 |
boolean类型
boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。这两个值不能与整型进行相互转换,这与C++不同。Java没有明确给出boolean类型占用的内存空间大小。