2.1 标识符、关键字和数据类型

2.1.1 标识符和关键字

1.Java语言标识符

Java语言中用来表示变量名、常量名、类名、接口名、对象名、方法名、文件名等的有效字符序列称为Java语言标识符(Identifier)。Java语言标识符使用Unicode字符集里的字符或者字符组成的序列来命名,Unicode字符集是用16位二进制数(即双字节)来表示字符的,共可以表示65536(216)个字符,其中包含了键盘上的所有符号、汉字、日文、朝鲜文、俄文、希腊字母等。Java语言有一套对标识符的命名规则,用于规定允许使用的名称。

(1)Java语言标识符必须是以字母、下画线(_)或美元符号($)开始,后跟字母、下画线(_)、美元符号($)或数字(数字0~数字9)所组成的字符或字符序列。

例如:name、a、_id、$user_Name、user$、id3、姓名、班级1等都是合法的Java标识符,而23name、class-id、8hello、gear*、wheel?、null、#room等都是非法的Java标识符。

通常建议以字母开始命名标识符,而不使用下画线(_)、美元符号($)、汉字或其他文字作为命名标识符的首字符。

(2)Java语言的标识符命名是严格区分大小写的。例如:name与Name,room与ROOM,分别是完全不同的两个标识符。

通常建议命名标识符时尽量使用完整单词,而不使用单个字母,这样表达的程序意义会更完全,更便于理解程序含义。

(3)Java语言标识符命名时长度不能超过65536个字符。通常建议标识符的单词长度不能太长,以便于阅读和记忆。单词长度也不能太短,这样会使程序的表示含义不清晰。

(4)Java语言标识符不能使用Java语言的关键字和保留字进行命名。例如:null、false和true是Java语言中的常量,它们都不能作为合法的标识符名字。

2.Java语言关键字

Java语言标识符是用户在合法的约定规则下自己定义的名字,而Java语言中还定义了一些具有特定含义的名字,这些名字称为关键字(Keyword)。这些关键字只能被用在程序中特定的地方,不能作为普通的Java语言标识符使用。Java语言的关键字如表2-1所示。

表2-1 Java语言的关键字

在表2-1中,带星号的const和goto在Java语言中并未使用,它们是Java语言中的保留字,不能作为普通的Java语言标识符使用。另外,false、true和null是Java语言中的常量值,不能与Java语言关键字相混淆。

3.Java语言的数据类型

要在各种应用程序中使用多种信息,程序必须能够存储多个不同类型的数据。无论什么时候使用数据,Java编译器都需要知道其数据类型,这些数据可能是整数、小数、字符或者是对象。Java语言定义了两大类数据类型:基本数据类型和引用数据类型,如图2-1所示。本章主要介绍基本数据类型,引用数据类型将在后面章节中介绍。

图2-1 Java语言的数据类型

2.1.2 基本数据类型

Java语言定义了8种基本数据类型,又称原始数据类型(Primitive Type)。它们是系统预定义的,并且以Java语言关键字命名。在Java语言中,每种基本数据类型数据占用的内存位数(又称域)是固定的,即每种基本数据类型数据的取值范围是固定的,它不依赖于具体的计算机,是完全与平台无关的。Java语言基本数据类型数据占用内存的位数和数据取值范围如表2-2所示。

表2-2 Java语言基本数据类型占用内存的位数和数据取值范围

续表

2.1.3 常量和变量

1.Java语言常量

常量是指在程序开发时需要使用明确的值,并且这个值在程序执行过程中不会改变。常量又被称为直接量或字面量。常量在使用过程中通常要指明其数据类型,否则计算机将不知如何处理该常量。

(1)整数常量

除了long类型整数外,byte、short、int类型整数的表示方法相同,只是数据取值范围不同(见表2-2)。在应用程序开发过程中,对byte、short、int和long类型整数常量通常使用八进制、十进制和十六进制计数系统。

Java语言中的十进制整数由常用的正号(+)、负号(-)和数字0~9组成。其中,除了整数0之外,第一个数字不能是0,否则会被认为是八进制数。例如:0、19、-389、800等都是合法的十进制数。

Java语言中的八进制整数由数字0开始,后跟正号(+)、负号(-)和数字0~7组成。例如:0(十进制的0)、031(十进制的25)、0257(十进制的175)、-0602(十进制的-386)等都是合法的八进制数。

Java语言中的十六进制数由0x或0X开始,后跟正号(+)、负号(-)、数字0~9和字母a~f(或A~F)组成。例如:0x0(十进制的0)、0xa1(十进制的161)、0X3BD(十进制的957)、-0Xfc(十进制的252)等都是合法的十六进制数。

long类型整数常量在表示方法上与byte、short和int不同,它需要在相应的整数后面加上字母L或l(L的小写字母)以与其他整数相区分。例如:-3L、047L(十进制的39),0x30bL(十进制的779)等都是合法的long类型整数。

(2)浮点数常量

浮点数常量属于实数数据。Java语言中浮点数常量用小数点表示,如果没有小数点,就表示整数。如果程序中出现2.0,它在计算机内部表示浮点数;如果程序中出现2,这个值表示整数。小数点前面或者后面可以没有数字,但不能同时没有数字,如2.或者.2均表示浮点数。浮点数常量也可以用科学计数法来表示,即一个浮点数可以紧跟字母E或字母e,代表乘以10次幂。例如:一个浮点数2.799×108,Java中可以写成2.799E+8。又如:一个浮点数-2.879×10-8,Java语言中可以写成-2.879E-8。按照数据在内存中所占的位数,即数据的表示精度来划分,浮点数常量在计算机中的存储表示有float和double两种类型。

float类型的浮点数常量表示32位的数据精度。Java语言中表示float类型常量时,通常在数值后面紧跟字母F或字母f。例如:34.843F、-28.78f、27.667e3F、26.55e-2f等都是合法的float类型浮点数。

double类型的浮点数常量表示64位的数据精度。Java语言中表示double类型常量时,通常在数值后面紧跟字母D或字母d。例如:34.843D、-28.78d、27.667e3D、26.55e-2d等都是合法的double类型浮点数。

在上面的表示例子中,如果同一个数用不同类型表示,那么其在计算机内存中占据的位数不同,表示的数据精度也不同。float类型的数据占用内存少,运算速度相对较快,只要精度能满足程序要求尽量使用float类型的数据,只有精度要求很高时,才使用double类型。如果表示浮点数常量时,数值后不跟F、f、D或d,则计算机默认为double类型。

(3)字符常量

字符常量是用一对英文半角的单引号括起来的一个字符,如:'a'、'@'、'中'等。Java语言使用16位无符号的Unicode字符集对字符进行编码,在计算机中以无符号整数进行表示。这个字符可以是Unicode字符集中的任何字符,比8位的无符号ASCII字符集表示的字符更加丰富。

在字符集中存在许多具有特殊含义的控制字符,如回车、换行等,这些字符很难用一般方式表示。为了明确的表示这些特殊字符,Java语言使用转义字符的方式定义它们,在一对英文半角的单引号中用斜线“\”开头,后面跟一个固定字符表示某个特定的控制符。

Java语言中的某些转义字符可以用3位八进制数来表示,一般写法为'\ddd'。ddd表示八进制数中的符号0~7,如'\101'、'011'等。八进制数只能表示'\000'~'\777'范围内的字符,不能表示Unicode集中的全部字符。

Java语言可以使用4位十六进制数来表示所有的Unicode字符,一般写法为'\uxxxx'。xxxx表示十六进制数中的符号0~f,如'\u4b3e'、'\u02f5'等。

Java语言中一些常用的转义字符及其含义如表2-3所示。

表2-3 Java语言中的常用转义字符及其含义

(4)布尔常量

布尔类型的数据常量只有两个值:true(真)和false(假),它不对应任何数值,不能与数值进行相互转换。布尔常量通常表示计算机中一个逻辑量的两种不同的状态值,一般用于程序中的条件判断。它在内存中占1位,即一个bit。

(5)字符串常量

字符串常量是用一对英文半角的双引号括起来的0个或多个字符序列,这些字符也包括转义字符。例如:"Hello"、"Hello World.\nLine"、"a"、"国"、"国家"、"123.50"、""、" "等都是字符串常量。

字符串常量不是Java语言的基本数据类型,它与字符常量也不同。例如:'a'是字符常量,而"a"则是字符串常量。

(6)自定义常量

除了Java语言自身定义的常量外,编程人员也可以自定义常量。自定义常量名一般全部为大写,并用Java语言关键字public、static和final进行修饰。它的一般书写格式为:

例如:

2.Java语言变量

变量是在程序的运行过程中其值可以改变的量。变量除了区分不同的数据类型外,还具有变量名和变量值两个特征。变量名是用户自己定义的Java语言允许使用的标识符,这个标识符代表计算机存储器中存储一个数据位置的名字,它代表着计算机中一个或一系列存储单元。变量的值是这个变量在某一时刻的取值,它是变量名所表示的存储单元中存放的数据,这个数据随着程序的运行有可能不断变化。

Java语言是严格匹配类型的程序设计语言,即所有变量在使用之前都必须声明或定义。变量的声明或定义一般书写格式为:

变量经声明或定义后,就可以对其进行赋值或使用了,如果在使用前没有赋值,则在编译时会显示语法错误。

(1)整数变量

与整数常量对应,Java语言有byte、short、int和long共计4种类型的整数类型变量。例如:

程序设计过程中使用整数常量时要注意数据取值范围,如果存取的数据超出该常量的取值范围,该数据就会被截断,从而改变了实际数据的值。如果经计算机计算后的结果超出计算机可表示的数据范围,就会产生溢出。一个整数最大值加1后,计算机就会发生上溢,该整数就变成了最小值。一个整数最小值减1后,计算机就会发生下溢,该整数就变成了最大值。在程序设计时要防止数据发生上溢或下溢。

(2)浮点数变量

与浮点数常量对应,Java语言有float和double两种类型的浮点数变量。例如:

(3)字符变量

Java语言中字符变量类型以char表示。虽然字符常量值在计算机中以无符号整数进行表示,但不能当作整数使用。字符类型变量的值可自动转换为int类型,反之则必须进行强制类型转换。例如:

(4)布尔变量

Java语言中布尔变量类型以boolean表示。boolean类型变量的值不能与其他类型的数据一起运算,这一点与C/C++不同。例如:

2.1.4 基本数据类型的转换

数据类型的转换是指在程序设计时出现的各种常量或变量数据类型不同时,所进行的数据类型变换(Casting Conversion)。Java语言不支持数据类型的任意转换,基本数据类型的转换分为自动类型转换和强制类型转换。

1.自动类型转换

自动类型转换允许在赋值和计算时由Java编译器按照一定的优先次序自动完成,它只能将占用内存位数少的数据类型向占用内存位数多的数据类型转换。Java编译器中基本数据类型的优先次序为byte,short,char <int<long<float<double。Java基本数据类型之间的自动转换规则如表2-4所示。

表2-4 Java基本数据类型之间的自动转换规则

续表

2.强制类型转换

如果将占用内存位数多的数据类型向占用内存位数少的数据类型转换,则只能进行强制类型转换,它由编程用户决定如何转换,由Java编译器去执行。它的一般书写格式为:

例如:

例题2.1 封装了Java语言基本数据类型之间自动类型转换和强制类型转换的程序。