java基础知识
文章目录
四、流程控制
4.1.基本结构
-
顺序结构
- 命令行按顺序执行
-
分支结构(选择结构)
-
根据条件进行选择不同的执行流程,可以得到不同的结果
-
类别
- 单分支语句
if–else
-
多分支语句
switch
-
-
循环结构
- 面对一些需要重复执行的语句,用户可以指定条件、次数,满足一定条件后,由机器自动识别执行
-
循环语句
例如:while、for
4.2.分支(选择)语句if
-
if语句-----单分支
if可以单独使用,但是,else不可以单独使用,必须与if进行配套使用
package jiaocai; public class test19if语句 { public static void main(String[]args) { int num=6; if(num%2==0) { System.out.println("num是偶数"); } /*if后面只有一个语句,{}省略,也不会报错, if(num%2==0) System.out.println("num是偶数"); 建议还是不要省略,培养良好习惯,减少不必 要的麻烦*/ System.out.println("num的值是"+num); int balance=500; if(balance==500); { System.out.println("买车"); System.out.println("吃饭睡觉"); /* 第二个if语句不起控制作用,但是会被执行, 但{}语句执行“与否”与if无关,必定会被执行 if(balance==500);{ 仔细观察: 因为在if的括号后面使用了分号, 此时,if语句控制的是一个空语句,if成立, 执行空语句,不成立,跳过if控制的空语句 if(balance==500);在if()后面加上分号, 不会报错,但是却是一个bug,致使if不起预期 控制作用 ---------------------------------------- System.out.println("买车"); ----语句1 System.out.println("吃饭睡觉");----语句2 } 此时{}里面的内容属于“{}非静态代码块” 不管第二个if成立与否,语句1,、语句2 均会执行 */ } } }
-
if–else-----双分支
package jiaocai; public class test20if_else语句 { public static void main(String[] args) { // TODO 自动生成的方法存根 int balance=50; if(balance==500) { System.out.println("买好车"); }else { System.out.println("买自行车"); } System.out.println("吃饭睡觉"); }//二选一的抉择,非黑即白 //{}范围就是控制范围,也就是作用域 }
-
if–else if-----多分支
-
注意:
1、本次流程控制
章节中,s1/s2/s3/s4等
, 都只是一个代表符号、代表的是一个语句块{}
,不是代表单单一个语句 2、就近原则,每个else都是与其最近的if进行 配对
3、不管判断过程有多么复杂,最终执行的只能 是一个语句块
{}
package jiaocai; //else就近原则进行匹配,不可以单独使用else, //必须与if配套使用 public class test21if_elseif语句 { public static void main(String[] args) { // TODO 自动生成的方法存根 int balance=500; if(balance==500) { System.out.println("买兰博基尼"); }else if(balance>=100&&balance<500) { System.out.println("买路虎"); }else { System.out.println("暂不买车"); } } } /* *int balance=500; if(balance==500) { 语句1 System.out.println("买兰博基尼"); }else if(balance>=100&&balance<500) { 语句2 System.out.println("买路虎"); }else { 语句3 System.out.println("暂不买车"); 不管判断过程有多么复杂,“最终执行的只能 是一个语句块`{}`的理解:” 这个例子中,语句1、语句2、语句3只能执行其中的一个 */
-
- boolean A=true;
if(A)就是条件表达式成立,执行if控制的语句块
- 若要取反,
if(!A)
-
注意:
-
if是需要进行真假判断的,而else和else if不需要
-
else不可以单独使用,不许配合if使用
package jiaocai; public class test22if布尔式hide正确格式 { public static void main(String[] args) { // TODO 自动生成的方法存根 boolean flag=true; if(flag)// !flag反面 System.out.println("flag的值为"+flag); //错误格式if(flag=true)不规范格式if(flag==true) else { System.out.println("flag的值为"+flag); } } }
-
4.3.多层判断switch
-
两种方式解决
- 使用
if-else if
进行多次判断,但操作较为复杂 - 使用Switch语句(推荐使用)
- 使用
-
Switch语句
-
实现多选一
-
if else if的加强版,专门用于处理多选一问题
-
注意:
- 唯一性,不可以两个case对应同一个值
- 常量表达式必须是基本数据类型的int或者字符型或者字符串(字符型可以转换为int),
前提JDK7以后版本
才可以支持 - switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型,可以进行隐式转换为以上类型的的除外
package jiaocai;
//多层判断的处理--成绩等级划分
public class test23Switch语句的使用 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int grade=7;
if(grade>=0&&grade<=5)
//实现0---5分简易化的处理
grade='A';
//非二选一,也就是符合if条件就执行,不符合跳过,
//但是Switch开始,一定会执行,与if条件符合与否,吴任何关系
//作用域决定了
switch(grade) {
case 10:System.out.println("成绩为优,成绩为:"+grade);break;
case 9:System.out.println("成绩为优,成绩为:"+grade);break;
case 8:System.out.println("成绩为良,成绩为:"+grade);break;
//跳出执行完本语句后,跳出下面的语句,
//上面的语句也不会执行,因为为匹配对应的case
case 7:System.out.println("成绩为中,成绩为:"+grade);break;
case 6:System.out.println("成绩为中,成绩为:"+grade);break;
/*case 5:System.out.println("成绩为不合格,成绩为:"+grade);break;
case 4:System.out.println("成绩为不合格,成绩为:"+grade);break;
case 3:System.out.println("成绩为不合格,成绩为:"+grade);break;
case 2:System.out.println("成绩为不合格,成绩为:"+grade);break;
case 1:System.out.println("成绩为不合格,成绩为:"+grade);break;
case 0:System.out.println("成绩为不合格,成绩为:"+grade);break;
*/
case 'A':System.out.println("成绩为不合格,成绩为:"+'A'+"即成绩在0~5分之间");break;
/*A不等同于'A'前者就是字母A,后者是字符A,字符A是可以与Unicode码中
与之相对应的int型
重点:“布尔型禁止转换为其它类型,涉及比较大小,其结果必定为布尔型”
case grade>=0&&grade<=5:System.out.println("成绩为不合格,成绩为:"+grade);break;
报错(boolean不能转为int型)grade>=0结果必定为布尔型,布尔型是不可以转换为任何类型的
case后面的常量表达式必须是int型或者是可以转换为int型的字符型
?
case if(grade>=0&&grade<=5):System.out.println("成绩为不合格,成绩为:"+grade);break;
*/
default:System.out.println("成绩为无效成绩,成绩为:"+grade);
//未匹配以上任何一个case,则使用default,最后面用不用break,请随便
}
}
}
针对以上进行优化:
package jiaocai;//利用break来控制输出相同的内容
public class test23a_Switch补充 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int grade=45;
switch(grade) {
case 10:
case 9:System.out.println("成绩为优");break;
case 8:
case 7:System.out.println("成绩为良");break;
case 6:System.out.println("成绩合格");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:System.out.println("成绩不合格");break;
//当grade=0----5时,输出相同的内容,只需要在case 0:作处理即可
default:System.out.println("成绩无效");
}
}
}
4.4.循环语句
背景:循环处理问题,重复的步骤处理
4.4.1.while语句
注意:
- 布尔表达式不可以为空,否则报错
- 布尔表达式不可以是常数,比如true,不然就又是一个程序bug,要么不进行循环,要么就是死循环,大规模消耗机器资源
- while()
;
在括号后面不可以有分号,同if语句一样的原因,用了分号,就意味着,while控制的是一个空语句,那就没有任何意义了- 比如while(x==5);
- 不会编程,不存在语法违规
- 因执行的是空语句(也就没有了循环终止条件,while将进入永无止境的死循环),浪费大量的内存空间,如果在一个大工程中,要想找出来进行修改,将会浪费大量的调试时间
- while(false){},直接报错
- 循环体要有无限逼近临界条件的表达式(往往是自增自减),否则也是一个死循环
package jiaocai;
public class test24while语句 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
long i=1L,sum=0L;
//数值较大时,记得使用long型,避免精度失准
while(i<=100) {
//布尔表达式的变量,控制型的i++放在最后面,循环终止条件
//------{}之间的就是循环体
sum=sum+i;
System.out.println("i等于:"+i+"的时候"+"sum的值为:"+sum);
i++;
//无限逼近循环终止条件的表达式
}
System.out.println("一到一百的和为:\n"+sum);
}
}
4.4.2.do while语句
背景:如何校验两次输入的密码一致?
- 格式:
注意:
- 不管while判断的布尔表达式如何,均会至少执行一次do
- 循环终止条件:while(!pwd1.equals(pwd2)); 判断是否要循环,字符串相等与否的使用epuals,不要使用“==”,在后年的字符串章节中会有说明
do while();分号不可以漏掉,否则报错,与while不同,不要混淆
- 布尔表达式不可以为空,报错
- 布尔表达式不可以是常数,循环体要有改变条件表达式的语句,否则都会形成死循环
package jiaocai;
import java.util.Scanner;
//导入仿真器的包
public class test25do_while实现两次密码校验 {
@SuppressWarnings("resource")//方法2
public static void main(String[] args) {
// TODO 自动生成的方法存根
//@SuppressWarnings("resource")//方法1
Scanner sc=new Scanner(System.in);
//解决sc报警的方法1和方法2,从键盘接受数据
String pwd1="0";
//定义字符串并赋予初始值
String pwd2="-1";
do {
System.out.println("请输入你注册QQ的密码");
pwd1=sc.nextLine();
System.out.println("请再次输入确认密码");
pwd2=sc.nextLine();
//System.out.println("你两次输入的密码不一致,请重新输入!");
if(!pwd1.equals(pwd2)) {
//A.equals(B) 判断A和B两个字符串是否相等
System.out.println("你两次输入的密码不一致或者未输入密码,请重新输入!");
}
}while(!pwd1.equals(pwd2));
//do while循环的终止条件的判断,循环体为do{}部分
System.out.println("你的QQ密码设置成功!\n"+"欢迎使用QQ");
}
}
4.4.3.for语句
4.4.3.1.普通的for语句
格式:
-
特殊
-
无限循环
for(直接在这里写两个英文分号){
…
} -
进行优化,使用break语句
-
package jiaocai; public class demo12 { public static void main(String[] args) { int x=0 ; for(;;){ //设置为死循环 x++; //自增表达式 x=x+1; System.out.println(x); if(x==4) { break; } /* * 额外设置循环条件,将死循环变成可以停止的循环 */ } } }
-
package jiaocai;
public class test26for语句求和 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int sum=0;
for(int i=1;i<=5;i++) {
//定义i并赋值,循环终止条件,无线逼近终止条件
sum+=i;
//简便的写法:sum=sum+i;
System.out.println("i="+i+"时,"+"sum的值为:"+sum);
}
}
}
package jiaocai;
//穷举法
public class test28百钱买百鸡 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int cock,hen,chick;
for( cock=1;cock<=20;cock++) {
//公鸡从1开始,控制公鸡数
for( hen=1;hen<=33;hen++) {
//母鸡数从1开始,控制母鸡数
for( chick=3;chick<=99;chick+=3)
//小鸡数从3开始,控制小鸡数
if(cock*5+hen*3+chick/3==100) {
//控制百钱
if(cock+hen+chick==100) {
//控制百鸡
System.out.println("公鸡买"+cock+"母鸡买"+hen+"小鸡买"+chick);
}
}
}
}
}
}
4.4.3.2.foreach语句
-
使用环境:JDK1.5以后版本,是for语句的延伸板加强版,减少了for语句代码的复杂度,目前广泛使用的,尤其是在数组问题上
-
格式
-
数组:相同数据类型的元素按一定的顺序排列的集合
-
遍历:对数组或集合中的每一个元素,逐一访问,依次读取一遍
package jiaocai;
public class test27foreach循环 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
long arr[]= {12,23,45};
//定义一个名叫arr的数组
for(long x:arr) {
//将arr数组中的元素依次赋值给long型变量x
System.out.println("x的值为:\n"+x);
}
}
}
-
一维
直接将每个元素进行遍历 -
二维
- 思路
化二维为一维 - 过程
第一个foreach遍历二维数组的行
第二个foreach遍历上一步遍历出的每一行 的每个元素
- 思路
package 第六章_数组;
public class T4遍历数组 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
char ch[][]=new char[4][];//创建一个4行的数组,列未知,合法
ch[0]=new char[] {'春','眠','不','觉','晓'};//对行进行初始化
ch[1]=new char[] {'处','处','闻','啼','鸟'};
ch[2]=new char[] {'夜','来','风','雨','声'};
ch[3]=new char[] {'花','落','知','多','少'};
System.out.println("----foreach语句遍历----");
System.out.println("foreach语句遍历二维数组的原理,将二维转换为一维,然后,依次输出");
for(char a[]:ch) {
//控行,利用foreach语句遍历所有元素特点,将ch数组的行(共4行)全部作为元素,赋值给一个数组a
for(char b:a) {
//将数组a(这是一个一维数组)的元素,也就是每一个索引位置的值输出
System.out.print(b);//不换行,输出
}
System.out.println();//输出玩一行后,进行换行
}
}
}
4.5.循环控制
4.5.1.break语句
作用:用于控制循环与否
package jiaocai;
public class test29break语句 {
public static void main(String[]args) {
int i=1;
while(i>0) {
System.out.println(i);
i++;
if(i==10)
break;
}
System.out.println("i=10时,符合if语句的终止条件,break终止while循环了");
}
}
package jiaocai;
public class test29a_break语句补充1 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
A:for(int i=0;i<3;i++) {
System.out.println("i="+i);
for(int j=0;j<5;j++) {
//未标签前提下,break在哪个循环里,就跳出哪个循环
System.out.println("\t"+"j="+j);
//"\t"作用空8格,便于观察,i=?对应的是哪个j
if(j==3)
break A ;
//加了A标签,跳出的便是外循环A了,只会输出一个i对应的J
}
//j永远不会到达j=4,j=3时,便跳出了,j的循环
}
}
}
4.5.2.continue语句
package jiaocai;
public class test30continue语句 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int i;
for(i=0;i<=10;i++) {
if(i%2!=0)
continue;
System.out.println(i);
System.out.println("&&*");
/*从输出结果可知,只要满足
continue前一句的条件,即i的值为奇数,就执
行continue语句从continue开始往下
面的任何语句均跳出,
不进行执行,先进行了增量i++操作,然后然后
判断再直接进行下一次循环,否则,应
该有10行"&&*"*/
//标签的使用和break一样
}
}
}
ontinue语句
package jiaocai;
public class test30continue语句 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int i;
for(i=0;i<=10;i++) {
if(i%2!=0)
continue;
System.out.println(i);
System.out.println("&&*");
/*从输出结果可知,只要满足
continue前一句的条件,即i的值为奇数,就执
行continue语句从continue开始往下
面的任何语句均跳出,
不进行执行,先进行了增量i++操作,然后然后
判断再直接进行下一次循环,否则,应
该有10行"&&*"*/
//标签的使用和break一样
}
}
}