
3.3 表达式和语句
表达式是由常量、变量、对象、方法调用等操作数与运算符结合形成的运算式,按照操作符的功能对操作数进行运算并返回运算结果。如果在表达式后加上分号,就形成表达式语句。例如,yourAge=age+5、age+1、var1 *= age+5、ans = x<y &&yn、a = a>>2、jTextField1.setText("" + 234.12f)、36%2==1 ? "36是奇数" : "36是偶数"等都是表达式。
3.3.1 运算符按元数分类
根据操作数组成表达式时所需要的操作数个数,运算符可以分为以下三类。
(1)一元运算符:只需要一个操作数的运算符。包括:+(正值)、−(负值)、++、− −、!、~。
(2)三元运算符:需要三个操作数的运算符。只有条件运算符?:是三元运算符。
(3)二元运算符:需要两个操作数的运算符。除了一元运算符和三元运算符以外,其他的都是二元运算符。
3.3.2 运算符的结合性
一个表达式中可能有多个运算符,那么居于两个运算符之间的操作数到底先跟哪个运算符结合进行运算就取决于运算符与操作数的结合方向,这就是运算符的结合性。
Java运算符的结合性分为两种:右结合性和左结合性。
右结合性:操作数与运算符自右向左结合。这种运算符包括所有一元运算符、赋值及所有复合赋值运算符、new、(类型)。
左结合性:操作数与运算符自左向右结合。除了右结合性运算符之外的其余所有运算符都是左结合性。
3.3.3 运算符的优先级
优先级是多个运算符同时出现在一个表达式中时,运算的先后顺序。由多个运算符和操作数构成的表达式中,到底先计算什么,后计算什么,这要依据运算符的结合性和优先级来共同确定。
表3.7列出了Java语言运算符的优先级和结合性,表中运算符优先级编号越小其优先级越高。例如,对于整型变量x、y及布尔型变量z,表达式“x > y && ! z”的运算次序是:逻辑取反运算符“!”的优先级最高,且为右结合性,所以先将变量z与“!”结合优先计算,随后关系运算符“>”比逻辑运算符“&&”优先级高且是左结合性,应计算“x > y”,最后计算逻辑运算符“&&”。再如,表达式a >> b + 3,加号“+”的优先级比位右移运算符“>>”高,先计算b + 3,再执行a的位右移运算。
表3.7 Java语言运算符的优先级和结合性

3.3.4 类型转换
在表达式中同时出现不同类型的操作数时,会涉及类型之间的转换,转换结果的类型就是表达式的类型。类型转换也称“造型”(Cast)。除了boolean和void类型之外,Java语言允许将任意一种基本类型转换为另一种基本类型。有以下两种转换方式。
1. 自动类型转换
在表达式中出现了占用不同大小存储空间的变量或常量时,Java编译器会自动将占用存储空间小的类型转换为占用存储空间大的类型。这种放大转换不会损失原类型变量或常量的任何信息,是一种安全的操作。转换方向是由低到高:
byte→short→char→int→float→double
例如,以下程序段会自动将int型量转换为long类型的量:
int i = 200; long l = i; // Java自动将变量i转换为long类型,然后赋值给变量l long l2 = 200; // Java自动将int型常量200转换为long类型,然后赋值给变量l2
2. 强制类型转换
如果需要将占用存储空间大的类型的量转换为占用存储空间小的类型的量,就可能面临信息丢失的危险。此时,编译器会强迫程序进行强制类型转换。强制类型转换使用运算符“(目标类型)”进行。例如,以下程序段:
long l = 200L; int i = (int)l ; //程序强制将变量l转换为int类型,然后赋值给变量i int i2 = 200.0; //编译程序时会出现错误,不能通过编译 int i3 = (int)200.0f; //程序强制将float型常量200.0f转换为int类型再赋值给变量i3
3.3.5 语句
Java程序由一条条语句构成,每一条Java语句都指示计算机完成特定运算或操作。本质上,Java程序是逐条语句执行的,执行完一条语句后接着执行下一条语句。可以通过改变语句位置而改变语句的执行顺序。
Java程序的一条语句是由分号作为结束符,可以在一行或多行输入,也可以一行输入多条语句。最简单的一条Java语句就是一个分号“;”,称为空语句,可以作为占位符,或用于消耗计算机执行时间而延时。
在表达式后加上分号,就形成表达式语句。
1. 复合语句
将多条语句用大括号({ })括起来可以形成一条复合语句(也称为语句块)。在一对大括号内声明的变量只能在这对大括号范围内使用,超出这个范围就不再有效,这个范围称为变量的作用域。且大括号可以嵌套,即一对大括号内可以有另外一对大括号,例如:

2. 注释语句
注释语句对程序的执行不起作用,但是对于程序开发和后期维护很有帮助。因此,在初学Java程序设计时应该养成使用注释的良好习惯。
Java语言提供了两种类型的注释语句。第一种注释用一个“/*”起头,随后是注释内容,并可跨越多行,最后用一个“*/”结束。许多程序员习惯在连续注释内容的每一行都用一个“*”开头,这种注释像下面这样:
/* 这是 * 一段注释, * 它跨越了多个行 */
第二种类型的注释叫作“单行注释”,是以一个“//”起头,表示这一行的所有内容都是注释。也可以在一条执行语句行后接着以“//”开始注释,称为行内注释。这种类型的注释更常用,因为它书写时更方便。下面便是这类注释的一个例子:
// 这是一条单行注释
程序开发的过程中需要编写相应的文档以实现程序文档化,这是程序后期维护的重要基础。Java程序可以将代码和文档链接起来,在程序源文件中同时编写代码和文档。为此,Java语言使用了一种特殊的注释语法,以便标记出文件中的文档内容;另外还提供一个工具——javadoc,用于提取这些注释及毗邻注释的类名或方法名,以HTML格式生成十分专业的程序文档。程序文档可方便地用Web浏览器查看。
Java程序中的文档注释及命令都只能出现于以“/**”开始,以“*/”结束的注释块中。其中的“文档标记”是一些以“@”开头的命令,置于注释行的起始处(但前导的“*”会被忽略)。
有三种类型的注释文档,它们对应于位于注释后面的元素:类、变量或者方法。也就是说,一个类注释正好位于一个类定义之前;变量注释正好位于变量定义之前;而一个方法注释正好位于一个方法定义的前面。如下面这个简单的例子所示:
/** 一个类注释 */ public class docTest { /** 一个变量注释 */ public int i; /** 一个方法注释 */ public void f() {} }
常用的文档注释命令如下。
@version版本信息:其中,“版本信息”代表任何适合作为版本说明的资料。
@author作者信息:其中,“作者信息”包括作者的姓名、电子函件地址或者其他任何适宜的资料。
@param方法的参数名说明:其中,“参数名”是指参数列表内的标识符,而“说明”代表一些可延续到后续行内的说明文字。
@return方法的返回值说明:其中,“说明”是指返回值的含义。
@exception完整类名说明:其中,“完整类名”明确指定了一个异常类的名字,它是在其他某个地方定义好的;而“说明”指出为什么这种特殊类型的异常会在方法调用中出现。
3. 流程控制语句
程序的流程是指程序中语句执行的次序。Java语言提供了完善的流程控制语句,而且随着JDK版本的逐步提升还陆续补充和完善了一些流程控制语句。流程控制语句是程序设计语言中基本而又关键的部分,Java语言通过流程控制语句,将有关语句组织成一些完成特定功能的逻辑程序块。
Java程序中语句的执行流程有以下三种。
(1)顺序流程:按照语句在程序中编写的先后顺序逐条执行,一条语句执行完接着执行相邻的下一条语句。
(2)分支流程:又称选择结构,是在多条执行路径中根据一定的条件选择其中一条路径执行的流程。
(3)循环流程:在一定的条件下,反复执行一段程序块的执行流程。被反复执行的程序段称为循环体,决定是否继续执行循环体的条件称为循环控制条件。