最基本的程序结构,按照代码编写的顺序,从上到下执行。根据要完成的功能,把这些工作编写成代码序列,然后按照这样的顺序执行就可以了。
例:下面的代码输出数字1到5
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
程序运行的时候,先执行第一行,然后第二行……直到执行完所有行。
除了这种顺序结构之外,还有选择结构和循环结构。本次内容介绍选择结构,下次介绍循环结构。
选择结构
在程序执行的过程中,会根据特定的条件选择执行某些语句,例如要计算两个整型变量a和b的最大值,有可能是a,也有可能是b,这时候需要根据a和b的关系来选择把a的值作为最大值,还是把b的值作为最大值。
选择结构包括两个:if和switch。
1. if语句
if语句就是在满足一定条件的时候,会执行一些语句。
基本结构:
if(条件表达式)
{
语句
}
条件表达式的结果必须是boolean类型的值,要执行的语句可以是多条,每条语句以分号结束即可。
如果条件表达式的值为true,将执行括号中的语句。如果条件表达式的值为false,则不会执行括号中的语句。
【例】求a和b的最大值。
// IfTest.java
public class IfTest {
public static void main(String[] args) {
int a = 10;
int b = 8;
int max = a;
if(a<b)
{
max = b;
}
System.out.println("最大值为:"+max);
}
}
运行结果为:
最大值为:10
如果括号中要执行的代码只有一行,可以不写括号,上面代码中main方法中的代码可以改写成:
int a = 10;
int b = 8;
int max = a;
if(a<b)
max = b;
System.out.println("最大值为:"+max);
if语句还可以被用于在两组语句中选择执行一组,要么执行第一组,要么执行第二组。基本结构如下:
if(条件表达式)
{
语句1
}
else
{
语句2
}
如果条件表达式的值为true,就执行语句1,否则将执行语句2。语句1和语句2总会有一个被执行。语句1和语句2都可以是多行,如果只有一行,则相应的括号可以省略。
例:使用if和else,完成上面的求最大值的功能。
使用下面的代码替换上面例子的main方法中的代码即可。
int a = 10;
int b = 8;
int max;
if(a<b)
{
max = b;
}
else
{
max = a;
}
System.out.println("最大值为:"+max);
运行的结果与上面的相同。
else后面的语句本身也可以使用if语句,这时候就会出现这样的结构:
if(条件表达式1)
{
语句1
}
else if(条件表达式2)
{
语句2
}
[else{语句3}]
[else{语句3}]表示这部分内容可以有,也可以没有,需要根据情况而定。这种格式的作用是:如果条件表达式1的结果为true,执行语句1,如果条件表达式1的结果为false,而条件表达式2的结果为true,执行语句2,否则执行语句3(如果有最后的else)。这时候完成的功能不再是在两个语句中选择执行一个,而是在多个语句中选择执行一个,这时候可以嵌套很多层。
【例】整型变量a的值可能是1、2、3和4,如果a为1,则输出“进行加法运算”,a为2,则进行减法运算,a为3,则进行乘法运算,a为4,则进行除法运算。
// IfElseTest.java
public class IfElseTest {
public static void main(String[] args) {
int a=3;
if(a==1)
System.out.println("进行加法运算");
else if(a==2)
System.out.println("进行减法运算");
else if(a==3)
System.out.println("进行乘法运算");
else
System.out.println("进行除法运算");
}
}
运行结果为:
进行乘法运算
如果改变a的值,运行结果会发生相应的变化。
2. switch语句
switch语句完成的功能是在多种情况中选择一个执行。就像上面的例子,根据整型变量a的值,输出不同的内容,也就是执行不同的语句,就可以使用switch语句。
switch语句的基本结构如下:
switch(表达式)
{
case 值1:语句1
case 值2:语句2
…
case 值n:语句n
default:语句n+1
}
如果表达式的值为“值1”,则从“语句1”开始执行,如果表达式的值为“值2”,则从“语句2”开始执行,如果表达式的值为“值n”,则从“语句n”开始执行,如果表达式的值没有与任何case匹配,则执行default,进行匹配的顺序是从前到后。这里的“语句1”、“语句2”、“语句n”和“语句n+1”指的不是一条语句,可以是多条语句。
先看下面的例子:
【例】
// SwitchTest.java
public class SwitchTest {
public static void main(String[] args) {
int a=2;
switch(a)
{
case 1:System.out.println("进行加法运算");
case 2:System.out.println("进行减法运算");
case 3:System.out.println("进行乘法运算");
case 4:System.out.println("进行除法运算");
default:System.out.println("a的值不合法");
}
}
}
运行结果为:
进行减法运算
进行乘法运算
进行除法运算
a的值不合法
从运行结果上看,并没有达到预期的目的,按照预期应该只输出“进行减法运算”,也就是运行结果的第一行。为什么会得到这样的结果,是因为switch结构中,匹配成功之后的所有代码都会执行,也就是case表达式仅仅决定了程序的入口。如果把变量a的类型定义成long类型,编译会报错。所以应该注意两点:
(1) 表达式的结果可以是short类型、byte类型、int类型、char类型和实现Enumeration接口的类型。不能使用long、float和double等。
(2) case匹配成功,只确定程序的入口。
要完成上面的功能,需要在每个case语句之后添加一个break,beak语句可以跳出选择结构,不再执行后面的代码,修改后的代码如下:
【例】
// SwitchTest2.java
public class SwitchTest2 {
public static void main(String[] args) {
char a=2;
switch(a)
{
case 1:System.out.println("进行加法运算");break;
case 2:System.out.println("进行减法运算");break;
case 3:System.out.println("进行乘法运算");break;
case 4:System.out.println("进行除法运算");break;
default:System.out.println("a的值不合法");
}
}
}
运行的结果为:
进行减法运算
这就是希望的结果了。
if语句和switch语句都是选择结构,如果选择比较少的情况应该使用if语句,如果选项比较多的时候应该使用switch。
另外,if语句的条件是布尔类型,而switch语句的条件是整数类型(包含char类型,而不包含long类型)和枚举类型。
【注意】不管使用if语句还是使用switch语句,都要把最常用的情况放在最前面,因为这样平均匹配次数就少了,如果把最常出现的选项放在了最后,这样每次都要进行几乎所有的匹配。