2. 基本程序设计
2.1 标 识 符
标识符是为了标识程序中诸如类、方法和变量的元素而采用的命名。
所有的标识符必须遵从以下规则:
- 标识符是由字母、数字、 下划线( _ ) 和美元符号($) 构成的字符序列。
- 标识符必须以字母、下划线( _ )或美元符号($)开头,不能以数字开头。
- 标识符不能是保留字(参见附录中的保留字列表)。
- 标识符不能是 true、false 或 null。
- 标识符可以为任意长度。
注意:由于 Java 是区分大小写的,所以 area、Area 和 AREA 都是不同的标识符。
提示:标识符是用于命名程序中的变量、方法、类和其他项。具有描述性的标识符可提高程序的可读性。避免采用缩写作为标识符,使用完整的词汇会更具有描述性。不要用字符 $ 命名标识符。习惯上,字符 $ 只用在机器自动产生的源代码中。
2.2 变 量
变量用于表示在程序中可能被改变的值。
变量用于表示特定类型的数据。为了使用变量,可以通过告诉编译器变量的名字及其可以存储的数据类型来声明该变量。变量声明告知编译器根据数据类型为变量分配合适的内存空间。
下面是一些变量声明的例子:
int count; // Declare count to be an integer variable
double radius; // Declare radius to be a double variable
double interestRate; // Declare interestRate to be a double variable
如果几个变量为同一类型,允许一起声明它们,如下所示:
datatype variablel, variable2, ... ( variablen;
变量之间用逗号分隔开。例如:
int i, j, k; // Declare i, j, and k as int variables
变量通常都有初始值。可以一步完成变量的声明和初始化。例如,考虑下面的代码:
int count = 1;
它等同于下面的两条语句:
int count;
count = 1;
也可以使用简捷的方式来同时声明和初始化同一类型的变量。例如:
int i = 1, j = 2;
在赋值给变量之前,必须声明变量。方法中声明的变量在使用之前必须被赋值。
任何时候,都要尽可能一步完成变量的声明和赋初值。这会使得程序易读,同时避免程序设计错误。
每个变量都有使用范围。变量的使用范围是指变量可以被引用到的程序的部分。
一个变量在可以使用前,必须被声明和初始化。
2.3 赋值语句和赋值表达式
声明变量之后,可以使用域值语句(assignment statement) 给它赋一个值。在 Java 中, 将等号( = )作为赋值操作符(assignment operator)。赋值语句的语法如下所示:
variable=expression;( 变量=表达式;)
表达式(expression) 表示涉及值、变量和操作符的一个运算,它们组合在一起计算出一个新值。例如,考虑下面的代码:
int y = 1; // Assign 1 to variable y
double radius * 1.0; // Assign 1.0 to variable radius
int x=5 * (3 / 2); // Assign the value of the expression to x
x = y + 1; // Assign the addition of y and 1 to x
double area = radius * radius * 3.14159;// Compute area
变量也可用在表达式中。变量也可以用于 = 操作符的两边,例如:
x=x + 1;
在这个赋值语句中,X+1的结果赋值给 X。假设在语句执行前 X 为 1,那么语句执行后它就变成了 2。
要给一个变量赋值,变量名必须在赋值操作符的左边。因此,下面的语句是错误的。
1=x;// Wrong
在数学运算中,x =2*x+1表示一个等式。但是,在 Java 中,x=2*x+1是一个赋值语句, 它计算表达式 2*x+1, 并且将结果赋值给 x。
在 Java 中,赋值语句本质上就是计算出一个值并将它赋给操作符左边变量的一个表达式。由于这个原因,赋值语句常常称作赋值表达式(assignment expression)。例如,下面的语句是正确的:
System.out.println(x = 1);
它等价于语句:
x=1;
System.out.println(x);
如果一个值要赋给多个变量,可以采用以下语法:
i =j = k = 1;
它等价于:
k=l;
j=k;
i=j;
在赋值语句中,左边变量的教据类型必须与右边值的数据类型兼容。例如,int x =1.0 是非法的,因为 x 的数据类型是整型 int。在不使用类型转换的情况下,是不能把 double 值(1.0) 赋给 int 变量的。
2.4 命名常量
命名常量是一个代表不变值的标识符。
一个变量的值在程序执行过程中可能会发生变化,但是命名常量(named constant) 或简称常量,则表示从不改变的永久数据。在程序清单中,π是一个常量。如果频繁使用它,但又不想重复地输入 3.14159, 代替的方式就是声明一个常量π。
常量必须在同一条语句中声明和赋值。
使用常量有三个好处:
1 )不必重复输入同一个值;
2 ) 如果必须修改常量值(例如,将π的值从 3.14 改为 3.14159),只需在源代码中的一个地方做改动;
3 ) 给常量赋一个描述性名字会提高程序易读性。
2.5 命名习惯
严格遵循 Java 的命名习惯可以让你的程序易于理解,以及避免错误。
应该确保程序中为变量、 常量、类和方法所选择的描述性名字是直观易懂的。命名是区分大小写的。
下面列出变量、常量、方法和类的命名习惯。
- 使用小写字母命名变量和方法。如果一个名字包含多个单词,就将它们连在一起, 第一个单词的字母小写,而后面的每个单词的首字母大写,例如,变量 radius 和 area 以及方法 print。
- 类名中的每个单词的首字母大写,例如,类名 ComputeArea 和 System。
- 大写常量中的所有字母,两个单词间用下划线连接,例如,常童 PI 和常量 MAX_ VALUE。
对类命名时不要选择Java 库中已经使用的名称。例如,因为 Java 已定义了 System类,就不要用 System 来命名自己的类。
2.6 数值数据类型和操作
2.6.1 数值类型
每个数据类型都有它的取值范围。
下表列出了六种数值数据类型、它们的范围以及所占存储空间。
2.6.2 从键盘读取数值
Scanner使用方法
Scanner scanner=new Scanner(System.in);
int xxx=scanner.nextInt();
2.6.3 数值操作符
数值数据类型的操作符包括标准的算术操作符:加号(+)、减号(- )、乘号(* )、除号(/) 和求余号(%),如表所示。
操作数是被操作符操作的值。
注意:当除法的操作数都是整数时,除法的结果就是整数,小数部分被舍去。例如:5/2 的结果是 2 而不是 2.5,而 - 5/2 的结果是 - 2 而不是 - 2.5。为了实现浮点数的除法,其中一个操作数必须是浮点数。例如:5.0/2 的结果是 2.5。
2.6.4 幂运算
使用方法 Math.pow(a,b)来计算 a^b。pow 方法定义在 Java API的 Math 类中。
2.7 数值型直接量
一个直接量(literal)是一个程序中直接出现的常量值。
- 整型直接量
只要整型直接量与整型变量相匹配,就可以将整型直接量陚值给该整型变量。如果直接量太大,超出该变量的存储范围,就会出现编译错误。例如:语句 byte b=128 就会造成一个编译错误,因为 byte 型变量存放不下 128 (注意:byte 型变M的范围是 -127~128)。
- 浮点型直接量
浮点型直接量带小数点,默认情况下是 double 型的。例如:S.0 被认为是 double 型而不是 float 型。可以通过在数字后面加字母 f 或 F 表示该数为 float 型直接量,也可以在数字后面加 d 或 D 表示该数为 double 型直接量。例如:可以使用100.2f 或 100.2F 表示 float型值,用100.2d 或 100.2D 表示 double 型值。
- 科学记数法
浮点型直接量也可以用 a * 10^b 形式的科学记数法表示,例如,123.456 的科学记数法形式是 1.23456 * 10^2 ,0.012 345 6的科学记数法是 1.23456* 10^-2。 一种特定的语法可以于表示科学记数法的数值。例如,1.23456 * 10^2可以写成 1.23456E2 或1.23456E+2,而1.23456 * 10^- 2 等于 1.234S6E -2。E (或 e) 表示指数,既可以是大写的也可以是小写的。
2.8 增强赋值操作符
操作符 +、 - 、*、/、% 可以结合赋值操作符形成增强操作符。
经常会出现变量的当前值被使用、修改,然后再重新赋值给该变量的情况。例如,下面语句将变量 count 加1。
count=count + 1;
Java 允许使用增强赋值操作符来结合赋值和加法操作符的功能。例如,上面的语句可以写成:
count += 1;
符号 +=称为加法赋值操作符(addition assignment operator)。其他简捷赋值操作符如表中所示。
增强赋值操作符在表达式中所有其他操作符计算完成后执行。例如:
x /=4 + 5.5 * 1.5;
等同于
x=x /(4 + 5.5 * 1.5);
注意:在增强操作符中是没有空格的。例如:+ =应该是 +=。
2.9 自增和自减操作符
自增操作符(++) 和自减操作符( -- ) 是对变量进行加 1 和减 1 的操作。
++和 -- 是对变量进行自增1和自减 1的简写操作符。由于这是许多编程任务中经常需要改变的值,所以这两个操作符使用起来很方便。例如,下面的代码是对 i 自增1, 而对 j自减 1:
int i=3, j=3;
i++ // i becomes 4
j--; // j becomes 2
2.10 数值类型转换
通过显示转换,浮点数可以被转换为整数。
double d=4.5;
int i=(int)d; // i becomes 4, but d is still 4.5
将一个 int 型变量赋值给 short 型或 byte 型变量,必须显式地使用类型转换。例如,下述语句就会有一个编译错误:
int i =1;
byte b = i;// Error because explicit casting is required
然而,只要整型直接量是在目标变量允许的范围内,那么将整型直接量赋给 short 型或 byte 型变量时,就不需要显式的类型转换。
2.11 常见错误和陷阱
- 常见错误 1: 未声明、未初始化的变置和未使用的变量
变量必须在使用之前声明为一个类型并且賦值。一个常见的错误是没有声明变量或者初始化一个变量。
- 常见错误 2: 整数溢出
数字以有限的位数存储。当一个变量被陚予一个过大(以存储大小而言)的值,以至无法存储该值,这称为溢出。
- 常见错误 3: 取整错误
一个取整错误,也称为凑整错误,是在计算得到的数字的近似值和确切的算术值之间的不同。例如,如果保留三位小数位数,1/3 近似等于 0.333, 如果保留 7 位,近似值是0.333 333 3。因为一个变量保存的位数是有限的,因此取整错误是无法避免的。涉及浮点数的计算都是近似的,因为这些数没有以准确的精度来存储。
- 常见错误 4: 超出预期的整数除法
Java 使用同样的除法操作符来执行整数和浮点数的除法。当两个操作数是整数时,/ 操作符执行一个整数除法,操作的结果是整数,小数部分被截去。要强制两个整数执行一个浮点数除法时,将其中一个整数转换为浮点数值。
- 常见陷阱:冗余的输入对象
编程新手经常为每个输入编写代码创建多个输入对象。
附录
下面是 Java 语言保留使用的 50 个关键字:
关键字 goto 和 const 是 C++ 保留的关键字,目前并没有在 Java 中使用到。如果它们出现在 java 程序中,Java 编译器能够识别它们,并产生错误信息。
字面常量 true、false 和 null 如同字面值 100 — 样,不是关键字。但是它们也不能用作标识符,就像 100 不能用作标识符一样。
在代码清单中,我们对 true、false 和 mill 使用了关键字的颜色,以和 Java IDE 中它们的颜色保持一致。
编译运算练习
1.
2.
3.