八、程序流程控制
1、顺序结构:即程序从上往下顺序执行的结构。
2、判断结构:代表语句——if
A:if语句的三种格式:
- 简单if语句:
if(条件表达式) {
执行语句;
}
- if……else语句
if(条件表达式) {
执行语句;
}else {
执行语句;
}
- 嵌套if语句
if(条件表达式) {
执行语句;
}else if (条件表达式) {
执行语句;
}
……
else {
执行语句;
}
注意:1)条件表达式意味着结果为 true 或 false;
2)花括号中只有一条语句时,花括号可以省略不写;
3)else只与它上方离它最近的if相匹配。
B:if语句特点:
a、每一种格式都是单条语句。
b、第二种格式与三元运算符的区别,使用三元运算符的
好处:简化 if……else 代码。
弊端:使用出现局限性
1) if……else可以有多条语句执行;
2)三元运算符运算完要有值出现,既表达式中不能有输出语句(空类型);
3)三元运算符可能会可能涉及到数据类型提升。
c、条件表达式无论写成什么样子,只看最终的结构是否是 true 或者 false;
d、一旦条件表达式结果为 true ,执行完相应花括号中的语句,整个语句就结束,不再往下判断。
C:if结构的应用
1 if(n>1) 2 System.out.println("a"); 3 else if(n>2) 4 System.out.println("b"); 5 else if(n>3) 6 System.out.println("c"); 7 else 8 System.out.println("d"); 9 System.out.println("—————————————————————————"); 10 if(n>1) 11 System.out.println("a"); 12 if(n>2) 13 System.out.println("b"); 14 if(n>3) 15 System.out.println("c"); 16 else 17 System.out.println("d");
执行结果:横线上是a;横线下是a b d
结果分析:
横线上是if语句的第三种形式,多重判断,只要有条件表达式为 true ,执行完相应花括号中的语句,整个语句就结束。
横线下是两个简单if语句和一个if……else语句,当花括号省略时,if只能控制一条语句。
3、选择结构
A:switch语句格式:代表语句 switch
switch(表达式) {
case 取值1:
执行语句;
break;
case 取值2:
执行语句;
break;
…...
default:
执行语句;
break;
}
B:switch语句特点:
-
a、switch语句表达式的类型(即case的匹配类型)只有六种:byte、short、int 、char、String(jdk7.0新增)、枚举(jdk5.0新增)。
-
b、switch的表达式中的变量需在switch外声明,case中的取值1、2、3等都是常量表达式,不能有变量,且常量表达式的运算结果必须在以上六种类型内。
-
c、case语句是顺序检测的,这些case和default在书写上是没有顺序的,先从匹配的case执行,没有匹配的case才检测default(不管default写在哪)。
-
d、结束switch语句的两种情况:遇到break;执行到switch语句结束(检测顺序:case->default)。
-
e、关键字break是可选的;默认情况default是可选的。
-
f、如果匹配的case或者default没有对应的break,那么程序会继续执行下个case里的执行语句,不会再对case值进行判断,直到遇到break或者switch结尾结束。应用于当几个case里的值所要执行的语句都一样的时候,我们可以不写break。
例如:我们做一年有四季的例子:
1 int month = 4; 2 switch (month){ 3 case 3: 4 case 4: 5 case 5: 6 System.out.println(month+"月是春季"); 7 break; 8 case 6: 9 case 7: 10 case 8: 11 System.out.println(month+"月是夏季"); 12 break; 13 case 9: 14 case 10: 15 case 11: 16 System.out.println(month+"月是秋季"); 17 break; 18 case 12: 19 case 1: 20 case 2: 21 System.out.println(month+"月是冬季"); 22 break; 23 default: 24 System.out.println(month+"月没有这样的月份") 25 26 }//上述例子就是三个case里面的值输出都一样的,所以我们省略了break;这样会少写几行代码,提高效率
C:if和switch语句的使用选择
if和switch语句很像,具体什么场景下,应用哪个语句呢?
-
如果判断的具体数值不多,而且符合byte、short、int 、char、String、enum这六种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
-
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。
4、循环结构
A:while语句格式:
while(条件表达式) {
循环体;
}
B:do……while语句格式:
do {
循环体;
}while(条件表达式);
注意:执行语句中要包含控制循环次数的语句,可使循环结束。do……while语句后有个分号,而while不用。
C:for语句格式:
for(初始化表达式;循环条件表达式;循环后的操作表达式) {
循环体;
}
注意:
1)循环条件表达式结果必须为boolean型(for循环中省略不写默认为true);
2)for中的三个表达式可以是多个表达式,这时表达式间要用逗号隔开。
D:三者的联系与区别
a、while和do while的区别:
do……while语句会先执行循环体,再去判断条件,也就是说无论条件是否满足,它都至少要执行一次循环体,先执行,再判断。
while 先判断条件,只要条件不满足就不再执行循环体了,先判断,再执行。
b、for里面的连个表达式运行的顺序:
初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复这个过程,直到条件不满足为止。
c、while和do while的区别:
while与for可以互换,区别在于for为了循环而定义的变量,在for循环结束就会在内存中释放;而while循环使用的变量在循环结束后还可以继续使用。
所以,如果只为循环而使用的变量,用for循环更合适,节省内存空间;如果是语句结束后还要继续使用变量,用while。
d、最简单无限循环格式:while(true){} 、 for(;;){}、无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。
e、循环之间可以嵌套。
5、其他流程控制语句
A:break(跳出), continue(继续)
应用范围:
break语句:选择结构(switch)和循环结构(for和while)。
continue语句:应用于循环结构(for和while)。
B:特点
a、这两个语句离开应用范围,存在是没有意义的。
b、这个两个语句单独存在下面都不可以有语句,因为执行不到。
c、continue语句是结束本次循环继续下次循环;多配合if语句和标号使用。
d、标号的出现,可以让这两个语句作用于指定的范围。
1 class BiaoHaoDemo { 2 public static void main(String[] args) { 3 //break: 4 w:for(int x=0; x<3; x++) { 5 for(int y=0; y<4; y++) { 6 System.out.println("x="+x); 7 break w; 8 } 9 } 10 11 //continue:只能作用于循环结构。特点:结束本次循环,继续下一次循环。 12 for(int x=1; x<=10; x++) { 13 if(x%2==1) 14 continue; 15 System.out.println("x="+x); 16 17 } 18 19 w:for(int x=0; x<3; x++) { 20 for(int y=0; y<4; y++) { 21 System.out.println("x="+x); 22 continue w; 23 } 24 } 25 26 /* 27 记住: 28 1,break和continue语句作用的范围。 29 2,break和continue单独存在时,下面不可以有任何语句。因为都执行不到。 30 */ 31 } 32 }
6、实例练习
A:累加思想
原理:通过变量记录住每次变化的结果;通过循环的形式,进行累加动作。
1 /* 2 1,获取1~10的和,并打印。 3 */ 4 class ForTest2 { 5 public static void main(String[] args) { 6 //1,定义变量用于存储不断变化的和。 7 int sum = 0; 8 //2,定义变量,记录住不断变化的被加的数。 9 int x = 1; 10 //3,定义循环,重复加法的过程。 11 while(x<=10) { 12 sum = sum + x; 13 x++; 14 } 15 System.out.println("sum="+sum); 16 /* 17 循环注意: 18 一定要明确哪些语句需要参与循环,哪些不需要。 19 */ 20 21 /* 22 其实这就是累加思想。 23 原理:通过变量记录住每次变化的结果。 24 通过循环的形式。进行累加动作。 25 */ 26 } 27 }
B:计数器思想
原理:通过一个变量记录住数据的状态变化;也是通过循环完成。
1 /* 2 2,1~100之间 7的倍数的个数。并打印。 3 思路: 4 1,先对1~100进行循环(遍历)通过循环的形式。 5 2,在遍历的过程中,定义条件。只对7的倍数进行操作。 6 3,因为7的倍数不确定,只要符合条件,就通过一个变量来记录住这个变化的次数。 7 8 步骤: 9 1,定义循环语句,选择for语句。 10 2,在循环中定义判断。只要是7的倍数即可。使用if语句。条件:7的倍数 x%7==0; 11 3,定义变量,该变量随着7的倍数的出现而自增。 12 */ 13 class ForTest3 { 14 public static void main(String[] args) { 15 int count = 0; 16 for(int x=1; x<=100; x++) { 17 if(x%7==0) 18 //System.out.println("x="+x); 19 count++; 20 } 21 System.out.println("count="+count); 22 23 /* 24 计数器思想。 25 通过一个变量记录住数据的状态变化。 26 也许通过循环完成。 27 */ 28 } 29 }
C:for循环嵌套
特点:外循环控制行数;内循环控制每一行的列数,也就是一行中元素的个数。
1 /* 2 九九乘法表 3 1*1=1 4 1*2=2 2*2=4 5 1*3=3 2*3=6 3*3=9 6 …… 7 */ 8 class ForForTest { 9 public static void main(String[] args) { 10 for (int x=1; x<=9 ; x++) { 11 for (int y=1; y<=x; y++) { 12 System.out.print(y+"*"+x+"="+y*x+"\t"); 13 } 14 System.out.println(); 15 } 16 } 17 }
1 class BiaoHaoDemo { 2 public static void main(String[] args) { 3 //break: 4 w:for(int x=0; x<3; x++) { 5 for(int y=0; y<4; y++) { 6 System.out.println("x="+x); 7 break w; 8 } 9 } 10 11 //continue:只能作用于循环结构。特点:结束本次循环,继续下一次循环。 12 for(int x=1; x<=10; x++) { 13 if(x%2==1) 14 continue; 15 System.out.println("x="+x); 16 17 } 18 19 w:for(int x=0; x<3; x++) { 20 for(int y=0; y<4; y++) { 21 System.out.println("x="+x); 22 continue w; 23 } 24 } 25 26 /* 27 记住: 28 1,break和continue语句作用的范围。 29 2,break和continue单独存在时,下面不可以有任何语句。因为都执行不到。 30 */ 31 } 32 }
7、语句的最后总结
(1)什么时候用变量? 当数据不确定的时候,就定义变量来存储数据。
(2)什么情况下,使用哪个语句?
A:当对某几个值进行判断的时候,可以使用if语句,或者switch语句,建议使用switch。
但是,使用switch要注意,它只能操作六种类型的值,byte,short,int,char,String,枚举。
如果是六种以外的值,需要使用if。
B:如果对数据区间进行判断,或者对运算结果是boolean类型的进行判断,用if语句。
C:当需要某些语句执行很多次的时候,使用循环结构。如果定义变量只为循环增量存在时,可以使用for语句。
如果对一个条件进行一次判断使用if,如果对该条件进行多次判断,使用while
D:如果要结束循环,可以控制循环条件,或者通过break语句完成。
如果要控制循环的流程,是否该继续执行,可以通过continue或者break来完成。
E:break结束当前所在循环;continue结束本次循环,进入下一次循环。
九、函数
1、函数的定义
A:什么是函数?
函数就是定义在类中的具有特定功能的一段独立小程序。
函数也称为方法。
B:函数的格式:
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,……) {
执行语句;
return 返回值;
}
C:格式注解:
-
修饰符:public static等
-
返回值类型:函数运行后需要返回的结果的数据类型。
-
函数名:为了方便使用这个函数,给它起个名字,这个名字要符合标识符命名规则;作用是体现函数功能。
-
参数类型:是形式参数的数据类型。
-
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
-
实际参数:传递给形式参数的具体数值。
-
return:用于将结果返回给函数调用者,并结束函数。
-
返回值:需要返回给调用者的值。
2、函数的特点
A:定义函数的好处
定义函数可以将功能代码进行封装,便于对该功能进行复用
函数的出现提高了代码的复用性
B:函数的特点
函数(主函数除外)只有被调用才会被执行
对于函数没有具体返回值的情况,返回值类型用关键字void表示,此时该函数中的return语句如果在最后一行可以省略不写。
C:注意事项
函数中只能调用函数,不可以在函数内部定义函数。
定义函数时,函数的结果应该返回给调用者,交由调用者处理。
定义的函数最好只完成某一个功能,不要赋予一个函数太多功能,因为函数是对特定功能的封装。
3、函数的应用
A:两个明确
明确要定义的功能最后的结果:返回值类型
明确在定义该功能的过程中是否需要未知内容参与运算,明确未知内容的类型和个数:参数列表
B:示例
需求:定义一个功能,可以实现两个整数的加法运算。
分析:
该功能的运算结果是什么?两个数的和,也是一个整数(int)
在实现该功能的过程中是否有未知内容参与运算?加数和被加数是不确定的(两个参数int,int)
代码:
int getSum(int x,int y) {
return x+y;
}
4、函数的重载
A:重载的概念:函数名相同,参数列表不同。
参数类型不同:int add(int i)void;add(double d)
参数个数不同:add(int a,int b);add(int a,int b,int c)
参数顺序不同:print(String name, int age);print(int age,String name)
注:参数顺序不同的重载是可以存在的,但是没有什么实际意义
B:重载的特点:与返回值类型无关,只看参数列表。
C:重载的好处:方便于阅读,优化了程序设计。
D:什么时候用重载:
当定义的功能相同,但参与运算的未知内容不同时,此时就定义一个名称以表示其功能,而通过参数列表的不同来区分多个同名函数。
E:重载示例:
a、返回两个整数的和
int add(int x,int y){return x+y;}
b、返回三个整数的和
int add(int x,int y,int z){return x+y+z;}
c、返回两个小数的和
double add(double x,double y){return x+y;}
F:总结:
主函数的主要功能其实是调用函数:所以尽量将功能封装成函数,然后交由主函数去调用。
一个类中不允许出现函数名和参数列表相同,但返回值不同的函数(虚拟机会不知道该返回哪个函数的结果)。