《Java 7程序设计入门经典》一2.2 Java的基本数据类型

2.2 Java的基本数据类型

Java包括两大类内置的数据类型:面向对象的数据类型和非面向对象的数据类型。Java中面向对象的数据类型由类定义,在后面会有类的介绍。但是,Java的核心是8种基本数据类型(也称元素数据类型或简单数据类型),如表2-1所示。这里使用“基本”(primitive)这个词来表示,从面向对象的角度看,这些类型不是对象,而是普通的二进制值。出于有效性,这些基本数据类型不是对象。
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

Java为每个基本数据类型严格指定范围和行为。所有Java虚拟机都必须支持这些。因为Java的可移植性需求,Java在这方面的要求是强制的。例如,int类型在所有执行环境中必须都是一样的。这使得程序完全可移植。没有必要为特定的平台重新编写代码。尽管在某些环境下,严格指定基本数据类型的范围会引起一些性能损失,但为了获得可移植性,这么做是值得的。

2.2.1 整数

Java定义了4种整数类型:byte、short、int和long。现列举如下:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

正如上表所示,所有的整数类型都是有符号的,它们可正可负。Java不支持无符号的整数(即非负的整数)。许多其他计算机语言同时支持有符号的和无符号的整数。但是,Java的设计者认为,无符号整数是不必要的。
注意:从技术上说,Java的运行时系统可以用任何大小来存储一个基本数据类型。但是,在任何情况下,该类型都应按规定运行。
最常见的整数类型是int类型。int类型的变量经常用于控制循环、标记数组索引、执行一般意义的整数数学运算。
在需要比int范围更大的整数时,可使用long类型。例如,下面是一个计算在1英里× 1英里×1英里大小的立方体里有多少立方英寸的程序:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

注意,1英里相当于5?280英尺。于是,为了计算在一立方英里有多少立方英寸,首先给出一英里里有多少英寸,然后再将这个值取立方。程序的输出如下所示:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

显然,这么大的数无法用int类型的变量来表示。
最小的整数类型是byte类型。byte类的变量在对原始的二进制数据进行操作时特别有用。原始的二进制数据也许不能由Java其他的内置类型直接支持。类型short创建一个短整形。short类型的变量在想要节约内存时比较合适,因为它不需要像int类型那样大的范围。
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

2.2.2 浮点类型

正如第1章介绍的那样,浮点类型可以表示含有小数部分的数。有两类浮点数:float和double,分别表示单精度和双精度数。float类型是32位宽,double类型是64位宽。它们大小的不同意味着,float类型的字面量最大约为3.4×1038,double类型的字面量最大约为1.8×10308。
在以上两种类型中,类型double是最常用的,因为Java类库中所有的数学函数都用double值。例如,定义在标准Math类中的sqrt()方法返回一个double值,它是double类型参数的平方根。这里,sqrt()方法在给定两条直角边的长度的情况下,用来计算直角三角形的斜边。
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

程序输出如下所示:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

在上述示例中还有一个注意点:正如上面介绍的那样,sqrt()方法是标准类Math的一个成员。请注意sqrt()的调用方法:它之前有类名Math。这与println()之前有对象名System.out相似。尽管不是所有的标准方法在调用时都要指定类名,但是有许多是这样的。

2.2.3 字符

Java不像那些使用8位量来表示字符的计算机语言。与其不同,Java使用16位来表示字符。其不同的原因在于Java支持Unicode字符。Unicode定义了可以表示所有人类语言中字符的字符集。最初,Unicode设计为16位,所以Java将char类型设计为16位长。在Java中,char类型是一个无符号的16位数,其取值范围为0到65?535。标准8位的ASCII字符集是Unicode字符集的子集,其范围为0~127。于是,ASCII字符在Java中仍然是有效字符。(ASCII表示美国信息交换标准代码(American Standard Code for Information Interchange)。)
可以把一个由单引号包裹的字符赋予一个字符变量。例如,若把字符X赋予字符变量ch:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

可以用println()语句输出char值。例如,下面这行代码输出ch的值:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

由于char是一个无符号的16位类型,因此可以在char变量上执行算术运算。例如,考虑以下程序:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

程序的输出如下所示:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

在程序中,首先把值X赋予ch。然后递增ch的值。结果是,ch包含Y,它是在ASCII(和Unicode)字符集序列中的下一个值。接着,给ch赋值90。在ASCII(或Unicode)字符集中,90对应字符Z。因为ASCII字符集占据了Unicode字符集中的前127个值,所以在其他语言中用到的那些字符伎俩在Java中同样适用。
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

2.2.4 布尔类型

类型boolean表示真值或假值。Java用保留字true和false定义真值和假值。于是,一个boolean类型的变量或表达式一定是这两个值之一。
下面的程序演示了boolean类型的用法:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

程序的输出如下所示:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

这个程序有三个令人感兴趣的要点:首先,当用println()方法输出一个boolean值时,显示“true”或“false”。其次,boolean变量的值本身足够用来控制if语句。不需要写像这样的if语句:
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

最后,关系运算符(例如“<”)的结果是boolean值。这是表达式10>9显示为true的原因。另外,10>9的外面有一对圆括号。这对圆括号是必需的,因为运算符“+”比运算符“>”有更高的优先级(precedence)。当一个运算符比其他运算符具有更高的优先级时,它会比同一表达式中的其他部分先计算。
《Java 7程序设计入门经典》一2.2 Java的基本数据类型

《Java 7程序设计入门经典》一2.2 Java的基本数据类型
《Java 7程序设计入门经典》一2.2 Java的基本数据类型