接上期后续
本期继续分享尚未结束的JavaSE章节
JavaSE属于初入门阶段,内容很多~
但很基础,
大家需保持耐心,慢慢的学~
争取你们学习的速度!
跟上我更新的速度哦~
今日新篇章
流程控制语句
【主要内容】
-
if单选结构
-
if双选结构
-
if多选结构
-
switch选择结构
-
for循环结构
-
while循环结构
-
do-while循环结构
-
break和continue关键字
-
嵌套循环
-
带标签的break和continue
-
方法定义和调用
-
方法重载
【学习目标】
1. 选择结构
Java程序的执行,一般分为三种执行方式:顺序执行、选择执行和循环执行。
1.1 if选择结构
1.1.1 if单选结构
【语法结构】
if(条件表达式) {
// 当“条件表达式”的结果为true时,则执行此处的代码;
}
【工作原理】
如果条件为真,则执行if中的语句,然后在执行if条件之后的语句;反之则不执行if中的语句,直接执行if之外的语句。
1、 根据年龄判断是否已经成年,年龄大于18表示成年。
2、 判断一个数是否在5(包含)到10(包含)之间。
1.1.2 if双选结构
【语法结构】
if(条件表达式) {
// 当“条件表达式”的结果为true时,则执行此处的代码;
} else {
// 当“条件表达式”的结果为false时,则执行此处的代码;
}
【工作原理】
如果“条件表达式”的结果为true,则执行if大括号中的代码;如果“条件表达式”的结果为false,则执行else大括号中的代码。
【随堂练习】
1、 模拟用户登录操作(用户名和密码都用字符串),需要判断出登录成功和登录失败的情况。
注意:判断字符串是否相同,不能使用==,而是需要使用equals方法。
1.1.3 if多选结构
【语法结构】
【工作原理】
【随堂练习】
1、 判断一个学生的成绩,如果90(包含)100(包含)为优秀,70(包含)90为良好,60(包含)~70为及格,60分以下输出不及格。
2、 输入一个整数month代表月份,根据月份输出对应的季节。
春季:3、4、5 夏季:6、7、8 秋季:9、10、11 冬季:12、1、2
3、 录入一个年份,判断其是否为闰年。
闰年的计算方法:年数能被4整除,并且不能被100整除;或者能被400整除的整数年份。
4、 输入时(hour)、分(minute)、秒(second)的一个具体时间,要求打印出它的下一秒出来(一天24小时)。
例如输入的是23时59分59秒,则输出00:00:00;例如输入17时09分59秒,则输出17:10:00。
1.1.4 if选择结构总结
1、 如果if选择结构只需执行一条语句时,那么可以省略{};如果需要执行多条语句,那么就是不能省略{}。为了提高代码的易读性,建议不要省略{}。
2、 {}中的代码语句也称为代码块,在代码块定义的常量或变量的作用域仅限于代码块中,在代码块之外不能被使用。
3、 能用if多选择结构就不要用if单选择结构,因为if多选择结构的效率要高于if单选择结构。
4、 在if选择结构中还可以嵌套别的选择结构或循环结构。
1.2 switch选择结构
1.2.1 switch选择结构
使用switch语句来选择要执行的代码块,与if条件分支语句比较类似。
【语法结构】
【工作原理】
switch语句会根据表达式的值从相匹配的case标签处开始执行,一直执行到break语句处或者是switch语句的末尾。与任一case值不匹配,则进入default语句(如果存在default语句的情况)。
【注意事项】
1、 switch()中的数据类型只能为:byte、short、int、char、String(JDK7)和枚举(后面会学习)。
2、 case后面必须是常量,并且常量的类型应该和switch()中的数据类型保持一致。
并且不允许有重复的case值。
3、 break用于跳出switch语句,根据需求我们我们可以省略break,
如果没有break, 一旦进入case,导致后面的所有case都能进入, 直到遇到break或switch结束。
4、 default可以省略,但是最好不要省略,除非case能匹配所有的可能性。
case和default的是无序的,不过default只能最后执行或不执行。
【随堂练习】
1、 输入一个整数,对应的显示出星期几,例如: 输入“1”,则输出为“星期一” 。
2、 接收一个人的成绩,如果成绩为: 90(包含)到100(包含)输出优秀,70(包含)到90输出良好,60(包含)到70输出及格,60分以下输出不及格。
3、 查询水果的价格,根据输入水果(fruit)的名字,输出对应的水果的价格,例如苹果6块/斤,香蕉3元/斤,榴莲20元/斤,西瓜0.8元/斤。
1.2.2 switch和if的区别
switch:建议判断固定值的时候用。
if:建议判断区间或范围的时候用,对运算结果是boolean类型的表达式进行判断。
注意:用switch能做的,用if都能做,但反过来则不行。
2. 循环结构
2.1 for循环结构
【语法格式】
for(循环初始化表达式; 循环条件表达式; 循环后的操作表达式) {
// 循环体
}
重点:掌握for循环的执行顺序。初始化表达式最先执行,并且在循环过程中只执行一次。
【随堂练习】
1、 输出0(包含)到100(包含)之间的数,分别以递增和递减的方式实现;
2、 输出1到100之间的奇数和偶数;
3、 输入一个正整数n,计算1+2+3+…+n的和;
4、 输入一个正整数n,计算1-2+3-4+5-6+…-(n-1)+n的和;
5、 输出1到1000之间既能被5整除又能被3整除的数,并且每行输出5个。
6、 求100到999之间的水仙花数。水仙花数的每个位上的数字的3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
2.2 while循环结构
【语法格式】
while (循环条件表达式) {
// 循环体
}
while循环和for循环比较类似,while循环会在循环条件表达式为真的时循环执行代码块。
2.3 do-while循环结构
【语法结构】
do {
// 循环体
} while(循环条件表达式) ;
先执行循环体,然后判断循环条件表达式,do-while循环循环体至少执行一次。
2.4 break和continue详解
2.4.1 break关键字**
在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。
适用于switch语句和循环结构中。当break作用于for循环上, “循环后的操作表达式”也不会执行。
注意:break之后不允许书写别的代码语句,因为break会跳出当前循环或switch,那么break之后的代码永远不会执行。
2.4.2 continue关键字
continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
Continue关键字只适用于循环结构中。
2.4.3 带标签的break和continue【了解】
goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用(Java没有goto)。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子,那就是带标签的break和continue。
“标签”是指后面跟一个冒号的标识符,例如:“label:”。对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。
【示例】
outer: for(int i = 0; i < 4; i++) {
for(int j = 0; j < 5; j++) {
if (j == 1) {
break outer;
}
}
}
【随堂练习】
1、 使用continue实现输出1到100之间能被5整除的数。
2、 韩信点兵,三人一组余两人,五人一组余三人,七人一组余四人,请问最少需要多少士兵。
3、[难]输入一个任意整数,判断它是否为质数。如果整数为7,则输出“7是质数”,如果整数为9,则输出‘9不是质数’。质数:除了1和它本身之外,不能被其他数整除的数称之为质数。
实现步骤:
1)通过Scanner获取一个正整数, 假设正整数为num。
2)通过循环获得[2, num)之间所有的整数,假设循环变量为i。
3)在循环体内部判断num是否能被i整除,也就是判断num是否为质数。
实现思路:采用假设法来实现。
a)在循环之前,先假设num是一个质数,设置flag标记的值为true
b)在循环体中,如果num%i==0,则推翻假设,设置flag标记的值为false,并跳出循环
c)在循环之后,如果flag值依旧为true,则证明是一个质数,否则证明不是一个质数。
实现代码:
2.5 while与for的区别
for和while的区别:
for循环能做的事情while循环都可以实现,使用循环的时候for和while都可以选择。
建议以下条件使用while循环:
1.循环结束后循环变量还需要参与运算,那么建议使用while循。
2.不确定循环次数的时候,建议使用while循环。
2.6 嵌套循环
在一个循环语句内部再嵌套一循环或多个循环,称为嵌套循环。while、do-while与for循环可以任意嵌套多层。
多重循环执行过程:外层循环变量变化一次,内层循环变量要变化一遍。
【随堂练习】
1、 在控制台先打印矩形,然后再打印平行四边形,再然后打印等腰三角形。
2、 使用嵌套循环实现九九乘法表(注意循环变量的初始值)。
3、 [难]输入一个正整数,然后把该正整数转化为二进制。
难点1:把正整数转化为二进制,假设输入的正整数为num=20
第一趟:bit = num % 2; num /= 2; --> num = 10, bit = 0
第二趟:bit = num % 2; num /= 2; --> num = 5, bit = 0
第三趟:bit = num % 2; num /= 2; --> num = 2, bit = 1
第四趟:bit = num % 2; num /= 2; --> num = 1, bit = 0
第五趟:bit = num % 2; num /= 2; --> num = 0, bit = 1
循环需要执行多少次呢???不确定,所以采用死循环。
什么时候跳出死循环呢???当num的值为0时跳出循环。
难点2:拼接二进制位,使用String类型的变量保存二进制
我们定义一个字符串类型的变量bitStr,并且设置初始值为空字符串,例如:String bitStr = “”;
第一趟:int bit = 1,bitStr = bit + bitStr; --> bitStr = “1”
第二趟:int bit = 1,bitStr = bit + bitStr; --> bitStr = “11”
第三趟:int bit = 1,bitStr = bit + bitStr; --> bitStr = “111”
第四趟:int bit = 0,bitStr = bit + bitStr; --> bitStr = “0111”
第五趟:int bit = 1,bitStr = bit + bitStr; --> bitStr = “10111”
实现代码:
4、[难]搬砖问题:36块砖,36个人搬,男搬4块,女搬3块,两个小孩搬1块,要求一次搬完,
问需要男、女、小孩各多少人?
思路分析:
条件:男人 + 女人 + 小孩 == 36 && 男人搬砖数量 + 女人搬砖数量 + 小孩搬砖数量 == 36
我们只需列举出男人、女人和小孩的人数区间范围,然后计算机依次去判断匹配即可!
男人的取值范围???[0, 9]
女人的取值范围???[0, 12]
小孩的取值范围???[0, 36]
3. 方法(method)
3.1 什么是方法
方法就是定义在类中的具有特定功能的一段独立小程序,用来完成某个功能操作。在某些语言中方法也称为函数或者过程。
特殊的main方法,该方法是程序的入口,由虚拟机来调用执行。在日常的开发中,不可能把程序的所有功能都放到main方法中,我们需要定义其它的方法来完成指定的功能,需要完成该功能时只需要调用方法即可。
3.2 方法声明&调用
3.2.1 方法声明格式**
[修饰符] 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,……) {
// 执行语句;
return 返回值;
}
方法格式说明:
1、 修饰符,用于控制方法的访问权限(后面的课程会细讲)。
2、 返回值类型,方法需要返回值的数据类型,如无返回值,必须声明返回值类型为void。
3、 方法名,方法的名字,要求必须符合标识符规范,并且采用小驼峰命名法则。
4、 形参列表,由参数类型和参数名组成,形参可以为任意多个,用于给方法内部传递数据。
5、 执行语句,书写方法需要实现的功能操作。
6、 返回值,如果定义了返回值类型,那么返回值和返回值类型必须保持一致;如果定义的返回值类型为void,那么需要省略返回值,也就是直接返回return ;即可
注意:当方法返回值类型为void时,还可以省略return;
3.2.2 方法调用格式
方法名(实际参数1, 实际参数2, ……);
实际参数(简称实参):传递给形式参数的具体数值,对应着形式参数(简称形参)。
注意事项:
1、 形式参数(形参)和实际参数(实参)的类型和个数必须一一对应。
2、 在方法中只能调用方法,不可以在方法内部再定义方法。
3、 当方法有返回值类型时,可以用一个变量用于接收方法的返回值,该变量的类型必须和方法返回值类型保持一致。
3.3 方法的运用
Ø 方法的使用,首先明确两个需求:
1、 明确要定义的功能最后的结果是什么?
2、 明确在定义该功能的过程中,是否需要未知内容参与运算?
Ø 方法的使用分为两个步骤:
1、 定义方法
2、 调用方法
Ø 定义方法,根据是否有参数列表、是否有返回值,可将定义方法分为四类:
1、 无参无返回值方法
2、 无参有返回值方法
3、 有参无返回值方法
4、 有参带返回值方法
Ø 调用方法,根据方法是否有返回值,可将调用方法分为两类:
1、 有返回值方法,可以用一个变量来接收返回值,也可以忽略返回值。
2、 无返回值方法,不能用一个变量来接收方法的void返回值。
3.3.1 无参无返回值方法
需求:在方法中输出“hello world”。
分析:不需要参数和返回值,应该选用无参无返回值方法。
【示例】
3.3.2 无参有返回值方法
需求:调用方法获得常量3+4的和。
分析:不需要外界传入参数,但是需要返回常量3+4之和。
【示例】
3.3.3 有参无返回值方法
需求:在方法中输出指定两个int变量的和。
分析:需要外界传入两个int类型的参数,但不需要返回值。
【示例】
3.3.4 有参有返回值方法
需求:调用方法获得指定两个double变量的和。
分析:需要外界传入两个double类型的形参,并返回两个double类型形参之和。
【示例】
3.4 方法调用过程
重点调用方法的内存图分析,课堂上详解。
3.5 方法的重载
3.5.1 重载的概念**
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
核心为两同两不同:
-
同一个类,同一个方法名
-
参数列表不同(类型、个数)
3.5.2 重载的特点
返回值类型不同,不构成方法的重载。
形参的名称不同,不构成方法的重载。
方法修饰符不同,不构成方法的重载。
注意:重载的方法,实际是完全不同的方法!只是方法名称相同而已!
3.5.3 重载的好处
查看JDK文档中System.out.println()方法,发现共有10个println()方法构成了“重载关系”,如下图:
方法重载通常用来命名一组功能相似的方法,这样做减少了方法名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。