
2.2 Java基本数据
在Java中,数据包括数字、字符,以及布尔值true或false。除直接在程序中使用这些数据外,我们经常用变量来代表数据。这些数据称为基本数据,代表这些数据的变量称为基本数据类型变量,或简称基本变量。常量是变量的特殊形式。本节将讨论Java提供的8种基本变量和常量的定义、赋值以及应用。Java还提供了多种类库进行数据的各种运算和操作,例如包装类(Wrapper class)、数学类(Math class)和BigDecimal类。后续章节将详细讨论有关数据运算和操作的类及其所提供的各种方法。
2.2.1 8种基本数据类型
用来储存基本数据的变量称作基本变量。表2.4列出了Java的8种基本数据类型及其取值范围。
表2.4 Java的8种基本数据类型

整型变量,如byte、short、int和long,只能存储整数。单精度浮点型变量float简称单精度型变量,可具有7位有效数值(不包括小数点);而双精度浮点型变量double简称双精度型变量,则可具有16位有效数值。Java对较大或较小的单精度或双精度数值,用科学记数法E表示。如28600000.0,则表示为2.86E7;而.000123为1.23E-4。
在字符变量char中,Java使用Unicode作为其字符代码,而Unicode要求每个字符占用两个字节。这样做的目的是可以将Java支持的字符扩展到65 536个,而传统的ASCII代码只有256个。为了兼容和转换方便,Unicode中的前256个代码与ASCII相同,所不同的是Unicode的每个字符要求两个字节。
布尔型在Java语言中成为正式的数据类型,而在C/C++中只能用0或1来模拟。注意,它的值true(真)或false(假)必须是小写字母。
字符串类型不属于基本数据类型。在Java语言中,字符串类型被定义为类。从它的关键字String可以看出,它是以大写字母开始的。回顾一下Java命名规范,类都以大写字母开头。由于字符串是常用的数据类型,为了使用方便,Java对字符串应用提供了特殊操作,即直接引用。例如:
String str = "This is a string"; //referencing
就是直接引用,或简称引用的例子。字符串直接引用和定义基本数据类型似乎相同,但有本质的区别。我们将在以后章节详细讨论字符串概念和各种操作。从实际应用角度,我们通常把字符串引用也称为定义字符串变量,并在本章进行讨论。
2.2.2 如何定义变量
在下面的例子中将定义了一个名为num的双精度型变量:
double num; //定义一个名为num的双精度型变量
顾名思义,变量不但可以储存某个数据的值,还可以修改这个值。因为Java提供了8种不同类型的数据,所以可以定义8种不同的变量。定义一个变量的语法格式为:
datatype variableName;
dataType为8种数据类型之一,variableName必须是合法标识符,并要求遵守命名规范。例如:

也可以同时定义多个相同类型的变量,每个变量名之间用逗号分开,如:

因为白色空格(包括空格、Tab键,以及回车键)在编译时都被忽略,所以,如下对变量的定义和上面的例子完全等同:

综上所述,定义变量的广义语法格式为:
datatype varName1[, varName2…];
其中,方括号中的内容为选择项。如果省略,则成为定义一个变量的形式;如果有多个变量,每个变量间用逗号分隔,但最后一个变量以分号结束。
更多信息 定义变量时要遵守Java所命名规范,即使用一目了然、清楚表达变量含义的标识符作为变量名。变量名首字母为小写。
2.2.3 什么是变量初始化
变量初始化是指一个变量定义后第一次赋予的值,即初始值。常见的变量初始化是由赋值语句完成的,例如:

它们完全等同于:

注意,一个数值型变量的初始值不一定是0;一个字符型变量的初始值不一定是' ',即空字符;一个布尔型变量的初始值不一定是true,可以是任何合法值。
也可以同时定义多个同一类型的变量,并赋予初始值,例如:

因为在Unicode中,字母'A'的代码为65,所以first_letter和letter_A具有相同的值'A'。表2.5列出了更多定义变量和初始化的例子。
3W 变量名实际上代表存储器的地址,可以储存变化的数据。变量初始化就是第一次赋予变量数据。
表2.5 定义变量和变量初始化例子

2.2.4 变量与存储器有什么关系
变量和存储器有直接关系。定义一个变量就是要求编译器分配所要求的内存空间。编译器在分配存储空间时,必须知道空间的大小,如多少字节。这个信息是通过我们所定义的变量类型来确定的。例如:
double price = 25.08;
根据这个语句,编译器知道我们需要8个字节的内存空间来存储一个名为price的双精度变量。并把数值25.08存入这个空间。那么,变量名和内存又有什么关系呢?
变量名实际上代表所分配存储空间的地址。每个字节的存储空间都有地址,而变量名代表其开始地址。这样CPU才可以访问该存储空间。但是用存储器的地址来代表变量,很不方便,这又回到机器编码时代了。用变量名代表存储器的地址是高级编程语言的特点。
变量和存储器的这种关系可以用图2.1表示。

图2.1 变量和存储器的关系
从图2.1可以看出,变量名price代表一个双精度数值25.08的存储地址。更确切地说,它代表8个字节存储器的开始地址,即89200。
在编译时对变量进行存储空间的分配称为静态绑定(static binding)。与之相对应的是动态绑定(dynamic binding),即在程序运行时才进行内存空间的分配操作。后续章节将专门讨论静态绑定和动态绑定问题。
3W 变量,包括常量,代表向编译器请求的存储空间。Java提供对存储空间或者存储器进行自动管理的功能,因而更可靠。
2.2.5 常量必须初始化
顾名思义,常量就是不变的量。常量也需要编译器分配存储空间,不过在这个存储器中的数据,一旦被存入,就不能再改变了。在Java中,用关键字final来表示所定义的是常量。常量在定义时必须同时赋予值,或者对其初始化。这也是Java的规定,否则便是语法错误。命名规范中要求常量用大写字母表示。下面是定义常量的典型例子:

常量定义的语法格式为:
final dataType CONSTANT_NAME = value;
3W 常量是不可变的量。即常量一旦赋值,就不可再变更,否则将产生编译错误。常量是变量的特殊情况。