你可以在程序中使用变量来容纳数据。这一小节将数据类型、怎样初始化变量以及怎样在代码块中引用变量。 实际上,对象是存储它的状态在变量中的。它的具体定义为:变量是用标识符命名的数据项。
你必须清除地为你想在程序中使用地每一个变量提供一个名字和类型。这个变量的名字必须是一个合法的标识符:以字母开头的一串Unicode字符。你可以使用变量名来引用变量包含的数据。这个变量的类型决定了什么类型的数值可以容纳以及什么的操作可以对它进行操作。为了得到一个变量、类型和名字,你必须编写变量声明,如下:
type name
除了名字和类型你还要给变量一个作用域。变量的作用域是由变量声明位置决定的。
以下MaxVariablesDemo程序,声明了八个不同类型的变量,如下:
这个程序的输出为:
The largest byte value is 127
The largest short value is 32767
The largest integer value is 2147483647
The largest long value is 9223372036854775807
The largest float value is 3.40282e+38
The largest double value is 1.79769e+308
The character S is upper case.
The value of aBoolean is true
下面的部分详细介绍了变量的各个方法,包括数据类型、名字、作用域、初始化以及final变量。这个MaxVariablesDemo程序使用了你可能不熟悉并且不在本节提到的两项:几个常数MAX_VALUE以及一个if-else语句。每个MAX_VALUE常数是定义在由JAVA平台提供的其中一个数字类中,它是最大的数值。
1 数据类型
每一个变量必须有一个数据类型。一个变量的数据类型决定了变量能容纳的数值和操作符。比如 ,在MaxVariablesDemo程序中,声明int largestInteger决定了largestInteger是一个整型数据类型(int)。整型只能容纳整型数(可以是正数也可以是负数)。你可以完成算术操作,比如,整型变量的加法等等。
JAVA程序语言有两类的数据类型:原始和引用。一个原始类型的变量为它的类型包含了适当大小和格式的单一数值:一个数字、字符或者一个布尔型数值。比如,一个整型数值是一个32位数据。
下面表格所有的JAVA支持的所有原始数据类型,还给出了它们的大小和格式以及简短的描述。MaxVariablesDemo程序为每一个原始类型声明了一个变量:
|
关键字 |
描述 |
大小/格式 |
|
整型 |
||
|
byte |
字节长度整型 |
8位两个补码 |
|
Short |
短整型 |
16位两个补码 |
|
int |
整型 |
32位两个补码 |
|
long |
长整型 |
64位两个补码 |
|
实数 |
||
|
Float |
单精度浮点型 |
32位IEEE 754 |
|
Double |
双精度浮点型 |
64位IEEE 754 |
|
其它类型 |
||
|
Char |
单个字符 |
16位Unicode字符 |
|
boolean |
布尔型数值(true或者false) |
真或假 |
在其它语言中,原始类型数据的格式和大小可能依靠于程序运行的平台。相比之下,Java程序语言可以指定原始数据类型的大小和格式。因此,你不必担心系统从属问题。
你可以在你的代码中直接为原始变量设置数值。比如,如果你需要为一个整型变量设置为4,你可以编写以下代码:
int anInt = 4;
数字4就是一个整型数值。下面是各种原始数值举例:
|
数值 |
类型 |
|
178 |
Int |
|
8864L |
Long |
|
37.266 |
Double |
|
37.266D |
Double |
|
87.363F |
float |
|
26.77e3 |
double |
|
' c ' |
char |
|
true |
boolean |
|
false |
boolean |
总得说来,没有小数点的数就是整型。你可以通过在数字后面加一个'L' 或者'l'指定为一个长整型。一般使用'L'而不使用'l',因为'l'很容易与数字'1'混起来。有小数点的数为双精度类型。你可以在数字后面放置'f' 或者 'F'来指定为实数。而字符型数值可以是处在单引号中间的任何单一的Unicode字符;两个布尔型数是true和false。
数组、类以及接口是引用的类型。引用类型变量的数值跟原始类型的数值比较起来,它是数值的一个引用或者是由变量代表的数值。
一个引用称为一个指针或者在其它语言中称为内存地址。JAVA编程语言象其它语言一样不支持地址的详细使用,你可以使用变量的名字来取代。
你可以在你的代码中直接为原始变量设置数值。比如,如果你需要为一个整型变量设置为4,你可以编写以下代码:
int anInt = 4;
数字4就是一个整型数值。下面是各种原始数值举例:
|
数值 |
类型 |
|
178 |
Int |
|
8864L |
Long |
|
37.266 |
Double |
|
37.266D |
Double |
|
87.363F |
float |
|
26.77e3 |
double |
|
' c ' |
char |
|
true |
boolean |
|
false |
boolean |
总得说来,没有小数点的数就是整型。你可以通过在数字后面加一个'L' 或者'l'指定为一个长整型。一般使用'L'而不使用'l',因为'l'很容易与数字'1'混起来。有小数点的数为双精度类型。你可以在数字后面放置'f' 或者 'F'来指定为实数。而字符型数值可以是处在单引号中间的任何单一的Unicode字符;两个布尔型数是true和false。
数组、类以及接口是引用的类型。引用类型变量的数值跟原始类型的数值比较起来,它是数值的一个引用或者是由变量代表的数值。
一个引用称为一个指针或者在其它语言中称为内存地址。JAVA编程语言象其它语言一样不支持地址的详细使用,你可以使用变量的名字来取代。
2 变量名
程序是用变量名来引用变量数值的。比如,当显示largestByte变量的数值的时候,MaxVariablesDemo程序就使用名字largestByte。一个名字,比如largesByte包含了一个单一的标识符,被称为简单的名字(即变量名)。在JAVA编程语言中,对于变量名有下面的必须满足:
这里有个约定:变量名是以小写字母开头,而类名是以一个大写字母开头的。如果变量名包含了多个单词,而每个单词要组合在一起,则在每个单词的第一个字母大写,比如IsVisible。而下划线(_)可以处在变量的任何地方,但是一般地它只用在常数中分离单词,因为常数名都是用大写字母的,利用下划线可以看得更清除。
3 作用域
变量的作用域是一个程序的区域,在上面变量可以通过它的名字来引用。其次,作用域也决定什么时候系统为变量创建和清除内存。作用域只应用成员变量并决定是否变量可以从所在类的外部使用。在程序中变量声明的位置建立它的作用域并且将它放置到以下四类之一:
成员函数作用域
当地变量作用域
方法参数作用域
异常处理参数作用域

(图14)
如图14所示。成员变量示类或者对象的成员。它是在类中定义而不在任何方法或者构造函数中定义。成员函数的作用域是类的完全定义。但是,当成员是使用在成员初始化表达式中的时候,成员的定义需要在它使用之前出现。在后面的教程中我们要再深入学习成员变量,这里就不讲了。
你可以在一个代码块中定义当地变量。总的说来,当地变量的作用域从它的声明扩展到了它被定义的代码块结束。在MaxVariablesDemo中,定义在主方法中的所有变量都是当地变量。程序中的每一个变量的作用域从变量的定义扩展到了主方法的结束,它在程序代码中是用右括号}来指示的。
参数是方法或者构造函数的正式参数,它们用于传递数值给方法和构造函数。参数的作用域是整个方法或者构造函数。
异常处理参数跟参数很相似,差别在是前者是传递参数给异常处理而后者是传递给方法或者构造函数。异常处理参数的作用域处在{和}之间的代码,它紧跟着catch语句。利用异常来处理错误向你说明了怎样编写一个带有参数的异常处理。以下是一个代码例子:
if (...) {
int i = 17;
...
}
System.out.println("The value of i = " + i); // 错误
最后的行不汇编因为当地变量I已经出了作用域。i的作用域是处在{和}之间的代码块。变量I在右括号}之后就不存在了。改正的方法可以是讲变量的声明移到if语句块的外面,或者是将println方法调用移动到if语句块中。
4 变量初始化
当地变量和成员变量可以利用一个赋值语句来初始化。变量的数据类型必须与赋给它的数值的数据类型相匹配。下面程序中的当地变量声明,其初始化如下:
// 整型
byte largestByte = Byte.MAX_VALUE;
short largestShort = Short.MAX_VALUE;
int largestInteger = Integer.MAX_VALUE;
long largestLong = Long.MAX_VALUE;
// 实数型
float largestFloat = Float.MAX_VALUE;
double largestDouble = Double.MAX_VALUE;
// 其它类型
char aChar = 'S';
boolean aBoolean = true;
参数和异常处理参数不能利用这种方法来初始化。它的参数的数值只能通过来设置。
5 final变量
你可以在任何作用域声明一个变量。Final变量的数值不能在初始化之后进行改变。这样的变量跟其它语言中的常量很相似。
为了声明一个final变量,你可以在类型之前的变量声明使用final关键字,比如:
final int aFinalVar = 0;
前面的语句声明了一个final变量并一起对它进行了初始化。如果你在后面还想给aFinalVar赋其它的值的话,就会导致一个编译错误。在必要的时候,你可以推迟对一个final本地变量进行初始化。你可以先定义,然后在之后再初始化,如下:
final int blankfinal;
. . .
blankfinal = 0;
已经声明了但是还没有初始化的final本地变量称为空白final。同时,一旦final本地变量被初始化,它就不能再设置了。并且之后的任何对blankfinal赋值的操作都将导致一个编译错误。
5 变量的总结
当你声明了一个变量,你就显性地设置了变量的名字和数据类型。JAVA编程语言右两类的数据类型:原始和引用。原始数据的变量包含一个数值。以下这张表显示了所有的原始数据类型以及它们的大小和格式。
|
关键字 |
描述 |
大小/格式 |
|
整型 |
||
|
byte |
字节长度整型 |
8位两个补码 |
|
Short |
短整型 |
16位两个补码 |
|
int |
整型 |
32位两个补码 |
|
long |
长整型 |
64位两个补码 |
|
实数 |
||
|
Float |
单精度浮点型 |
32位IEEE 754 |
|
Double |
双精度浮点型 |
64位IEEE 754 |
|
其它类型 |
||
|
Char |
单个字符 |
16位Unicode字符 |
|
boolean |
布尔型数值(true或者false) |
真或假 |
变量声明的位置隐含地设置了变量的作用域,它决定了代码的哪一部分可以通过变量名来调用这个变量。具体有以下四种类型的作用域:成员变量作用域、本地变量作用域、参数作用域以及异常处理参数作用域。
你可以使用赋值操作符(=)来在声明的地方对变量进行初始化。
你也可以将变量声明为final。Final变量的数值在初始化之后不能再被改变。