Day03 流程控制、循环、方法
- 流程控制
1.1 顺序结构
正常编码,从上往下,从左到右执行即可
1.2 分支结构
根据业务逻辑,某些代码在某种情况下执行
或者是根据不同的情况执行不同的代码
技术栈 : if…else … switch
1.2.1 If
1.2.1.1 单分支
package _04_If;
/**
-
单分支 :
-
有不执行情况,比如boolean表达式为false
-
if( boolean表达式 ){
-
java代码;
-
}
-
@Date 2021年3月23日
*/
public class IF_01 {public static void main(String[] args) {
// 又不执行情况
if(1>2){
System.out.println(“原来1小于2”);
}
}
}
1.2.1.2 双分支
package _04_If;
/**
-
双分支,有且只有一个分支执行
-
if( boolean表达式 ){
-
为真的代码;
-
}else{
-
为假的代码;
-
}
-
@Date 2021年3月23日
*/
public class IF_02 {public static void main(String[] args) {
if (1<2) {
System.out.println(“原来1小于2”);
}else{
System.out.println(“原来1大于2”);
}
}
}
1.2.1.3 多分支
多分支 : 只会有一条分支执行,有一条执行之后,整个分支结束
*
-
1 有不执行情况
-
if( boolean表达式 ){
-
真语句;
-
}else if( boolean表达式 ){
-
真语句;
-
}else if(......){
-
}
-
2 没有不执行情况
-
if( boolean表达式 ){
-
真语句;
-
}else if( boolean表达式 ){
-
真语句;
-
}else if(......){
-
}else{
}
1.2.1.4 特殊情况
package _04_If;
public class IF_04 {
public static void main(String[] args) {
// 若 分支只有一条语句,则{} 可以省略
if (true)
System.out.println("1111");
if(true)
System.out.println(222);
else
System.out.println("111111");
if(true)
System.out.println(222);
else if(false)
System.out.println("111111");
else if(false)
System.out.println("=========");
}
}
1.2.2 Switch
package _05_Switch;
/**
-
javaSE1.7之前 只可以操作 整型 1.7开始 (包括1.7) 可以操作字符串
-
switch( 整型/字符串 ){
-
case 值 :
-
代码;
-
break;
-
case 值 :
-
代码;
-
break;
-
case 值 :
-
代码;
-
break;
-
default :
-
代码;
-
}
-
@Date 2021年3月24日
*/
public class Switch_01 {
public static void main(String[] args) {
char c = ‘B’;
switch © {
// default 也可以写到最上面,但是还是会先执行case 再执行 default
default:
System.out.println(“差”);
break;
case ‘A’:
System.out.println(“优秀”);
break;
case ‘B’:
System.out.println(“良好”);
break;
case ‘C’:
System.out.println(“及格”);
break;
}switch (c) { // case合并,相当于 || , c=='A' || c=='B' case 'A': case 'B': System.out.println("优秀"); break; case 'C': System.out.println("及格"); break; default: System.out.println("差"); break; }
}
}
1.2.2.1 语法
package _05_Switch;
/**
-
每个分支都必须以 break结尾,否则会出现case穿透情况
-
找到符合条件的判断之后,就不再判断,直接执行后面的程序
-
@Date 2021年3月24日
*/
public class Switch_02 {
public static void main(String[] args) {
char c = ‘S’;
switch © {
// 如果没有break 也没有符合的条件,并且default也在最上面,则 穿透所有
default:
System.out.println(“差”);
case ‘A’:
System.out.println(“优秀”);
case ‘B’:
System.out.println(“良好”);
case ‘C’:
System.out.println(“及格”);}
}
}
1.2.2.2 案例
package _05_Switch;
/**
-
需求 :
-
1 系统给定学生成绩(可以带小数) [0-100] ,注意 switch 不能传递小数,不能使用范围 > < <=
-
2 编写程序,根据学生的成绩判断学生的成绩等级
-
[90-100] 优秀
-
[70-90) 良好
-
[60-70) 及格
-
[0-60) 不及格
-
只允许使用switch
-
@Date 2021年3月24日
*/
public class Switch_03 {public static void main(String[] args) {
double score = 98.2;
int grade = (int) (score / 10);
switch (grade) {
case 9:
case 10:
System.out.println(“优秀”);
break;
case 7:
case 8:
System.out.println(“良好”);
break;
case 6:
System.out.println(“及格”);
break;
default:
System.out.println(“不及格”);
break;
}
}
}
1.3 循环结构
重复执行某些代码
1.3.1 循环三要素
起始值,终止条件,步长
1.3.2 For
1.3.2.1 语法
For循环又称计数循环
1.3.2.2 案例
package _06_For;
/**
-
循环三要素 : 初始值,终止条件,步长
-
for循环又称计数循环,在某个次数范围内,重复做某件事
-
语法 :
-
for( 表达式1 ; 表达式2 ; 表达式3 ){
-
重复执行的代码;
-
}
-
执行过程 :
-
先执行表达式1 ,并且只执行一次
-
执行表达式2 , 根据结果进行处理,如果是true,就执行循环体,如果是false就终止
-
执行完循环体之后,执行表达式3 , 然后执行表达式2 ,同上...
-
重复执行 表达式3 , 表达式2 循环体,一直到 表达式2 为false 终止
-
@Date 2021年3月24日
*/
public class For_01 {
public static void main(String[] args) {
// 条件可以不写,分号必须有,死循环,没什么价值
// for( ; ; ){
// System.out.println(1);
// }for (int i = 0; i < 10; i++) { // 0 ~ 9 System.out.println(i); } // 无法访问循环中的变量 // System.out.println(i); int k ; for ( k= 0 ; k < 10; k++) { System.out.println("k="+k); } System.out.println(k); for (int i = 10; i >0; i--) { System.out.println(i); }
}
}
1.3.2.3 嵌套循环
package _06_For;
/**
-
嵌套循环 : 循环体中 还有一个循环
-
双重嵌套,可以模拟二维表格
-
可以把外层循环当做行,内层循环当做列
-
@Date 2021年3月24日
*/
public class For_02 {public static void main(String[] args) {
for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) { // 去掉ln 就不会换行了 System.out.print(j + " "); } // 换行 // System.out.println(); System.out.print('\n'); }
}
}
1.3.2.4 九九乘法表
package _06_For;
/**
-
九九乘法表
-
1x1 = 1
-
1x2 = 2 2x2 =4
-
1x3 = 3 2x3 = 6 3x3 =9
-
…
-
@Date 2021年3月24日
*/
public class For_03 {public static void main(String[] args) {
// for (int i = 1; i < 10; i++) {
// for (int j = 1; j < 10; j++) {
// System.out.print(0+" ");
// }
// System.out.println();
// }for (int i = 1; i < 10; i++) { for (int j = 1; j <= i; j++) { System.out.print(j+"x"+i+"="+(i*j)+" "); } System.out.println(); }
}
}
1.3.3 While
1.3.3.1 语法
1.3.3.2 案例
package _07_While;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
-
while循环 又称为真假循环,是某个条件为真的时候执行
-
语法 : while( boolean表达式 ){ java代码; }
-
@Date 2021年3月24日
*/
public class While_01 {public static void main(String[] args) {
// 这种场景 适合用for
int i = 0;
while (i < 10) {
System.out.println(i);
i++;
}List list = new ArrayList(); list.add(1); list.add(2); list.add(3); Iterator iterator = list.iterator(); // for (; iterator.hasNext();) { // System.out.println(iterator.next()); // } // 这种场景适合用while while (iterator.hasNext()) { System.out.println(iterator.next()); }
}
}
1.3.4 DoWhile
1.3.4.1 语法
1.3.4.2 案例
package _07_While;
/**
- do…while : 能够保证代码,至少执行一次,先执行一次,在判断要不要继续执行
- 语法 :
-
do{
-
java代码;
-
}while( boolean表达式 );
- @Date 2021年3月24日
*/
public class DoWhile {
public static void main(String[] args) {
// 保证先执行一次
int i =120;
do {
System.out.println(i);
i++;
} while ( i < 10 );
}
}
1.3.5 Break
package _08_break;
/**
-
break 语句 :
-
1 用于switch 结束分支,放置case穿透
-
2 用于循环中,结束循环(如果是嵌套循环的话,结束距离最近的)
-
@Date 2021年3月24日
*/
public class Break_01 {public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
// 应用场景 : 比如在一堆数据中找某一个数据,找到之后,循环就可以停止了,不用再比较了
if (i == 5) {
break;
}
System.out.println(i);
}
}
}
1.3.6 BreakOutfor
package _08_break;
public class Break_02 {
public static void main(String[] args) {
// for (int i = 0; i <5; i++) {
// for (int j = 0; j < 5; j++) {
// // 默认终止内层循环
// if (i == 3) {
// break;
// }
// System.out.print(j+ " ");
// }
// System.out.println();
// }
// 对外层循环设置个名字
outerFor: for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (j == 3) {
// 终止名字对应的循环,可以终止外层循环
break outerFor;
}
System.out.print(j + " ");
}
System.out.println();
}
}
}
1.3.7 Continue
package _08_break;
/**
-
continue 跳过当前次循环,继续下一次(碰到continue 直接执行 ++ 操作)
-
@Date 2021年3月24日
*/
public class Countinue_01 {public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if (i == 3) {
// 跳过当前次循环
continue;
}
// 0124
System.out.println(i);
}
}
}
1.4 流程控制总结
条件判断语句:if语句、switch语句。
循环执行语句:do while语句、while语句、for语句。
跳转语句:break语句、continue语句、return语句。
如图:
控制语句类型 关键字 作用
选择结构语句 if、if else、else if
switch 通过开关机制,选择要执行的代码
循环结构语句 for、while、do while 通过循序机制,反复执行相同的代码段
改变语句执行序 break、continue 通过打断或继续机制,改变当前工码的执行顺序
三种循环结构的异同点:
用while和do…while循环时,循环变量在循环体之前初始化,而for循环一般在语句1进行初始化。
while 循环和for循环都是先判断表达式,后执行循环体;而do…while循环是先执行循环体后判断表达式。也就是说do…while的循环体最少被执行一次,而while循环和for就可能一次都不执行。
这三种循环都可以用break语句跳出循环,用continue语句结束本次循环。
- 方法
2.1 概述
什么是方法 : 一堆代码的集合,当使用这个方法,就等于使用这些代码
- 优点 :
-
1 使程序更加简洁更加清晰
-
2 有利于程序维护
-
3 提高开发效率
-
4 提高代码的重用性
- 方法目的 : 代码重用,如果代码中出现很多重复代码,说明你的程序有问题
- 函数 : 在类之外,和类平级,使用该函数不需要任何二次引用,可以直接使用
- 方法 : 在类中,使用该方法的时候需要加前缀找到它
- 方法和函数其实是一个东西,只不过根据放置位置不同,叫法不同,调用方式不同
- c中只有函数, c++ 函数和方法都有,类外叫函数,类中叫方法, java中 只有方法
2.2 方法声明
方法声明 :
-
[修饰符列表] 返回值类型 方法名 (参数列表) { 方法体 }
-
[] : 表示可以有,也可以没有,也可以有多个
-
修饰符 : 可选的
-
权限控制 : public , private , protected , 默认 四选一
-
其他 : static , final , abstract , synchronized (final , abstract 二选一)
-
返回值类型 : 完成功能后,是否需要返回结果,如果不需要 就写void
-
如果需要返回结果,就写 结果数据 对应的类型即可 比如 返回一个9 ,返回值类型这里 就写 int/byte/short/long
-
可选 : 11种数据类型中任意一种 或 void 12选1
-
方法名 : 名字嘛,符合命名规则即可(大小写字母,美元符号,下划线,数字.且数字不能打头.不能使用关键字和保留字)
-
方法名 / 变量名 首字母建议小写, 类名 建议首字母大写
-
参数列表 : 调用方法时,需要传递的数据
-
可以有,可以有多个.可以没有,如果没有,() 只写小括号即可 , 多个用逗号隔开
-
形参 : 方法声明时,规定应该传入的数据的类型
-
实参 : 调用方法时,实际传递的具体的值
-
方法体 : java编码,要做的事
2.3 方法分类和调用
方法分类 :
-
静态方法 : 使用static修饰的方法是静态方法,类级别的
-
成员方法 : 没有static修饰
-
构造方法 : 用于创建对象
- 方法调用 :
-
静态方法 : 类名.静态方法名(参数); 类名.静态方法名();
-
成员方法 : 对象.成员方法名(参数)
-
构造方法 : new
- 方法不调用 不执行,调用才执行,并把结果 返回到调用处
-
意味着 编写方法的时候,不需要考虑先后顺序,只需要考虑调用顺序即可,先调用先执行
2.4 入口方法main
特殊方法main : 入口程序,由JVM调用,固定写法,不能更改, 参数列表中的变量名 args 可以改
-
java程序,可以理解为,只会执行main方法,所有代码的开始和结束,必须依赖于main方法中
2.5 Return
2.5.1 概述
2.5.2 无返回值
2.5.3 有返回值
eturn : 1 终止方法运行 , 2 返回数据
-
1 如果方法没有返回值(void) , 那么方法体中,可以 没有return,如果写return,
-
return后不能写任何数据,此时return只有终止方法运行的作用
-
2 如果方法有返回值(非void), 那么方法体中,必须有return,而且return后要写上返回值类型对应的数据
-
比如 返回值 int , 则 方法体中 " return int类型的值 ";
-
3 因为return有终止方法运行的作用,所以 return之后不能写任何代码
2.6 案例
package _09_Method;
public class Method_02 {
public static void main(String[] args) {
System.out.println("----");
// 调用m1,先调用,先执行,和方法声明位置无关
// 但在方法内部,依然是从上往下,从左到右执行
Method_02.m1(2, 3);
// 当前类中的静态方法,类名可以省略
m2(2, 3);
System.out.println("=====");
}
public static void m2(int a, int b) {
System.out.println(a * b);
}
public static void m1(int a, int b) {
System.out.println(a + b);
}
}
2.7 方法重载
package _09_Method;
/**
-
唯一性 : 表示唯一确定一个方法
-
1 方法名 , 2 参数列表
-
方法重载 : 方法名相同,参数列表不同
-
参数列表不同 : 1 个数不同, 2 类型不同
-
一下程序 功能类似,方法名不同,导致用户需要记住很多方法名
-
不方便记忆,不美观
-
@Date 2021年3月24日
*/
public class Method_04 {public static void main(String[] args) {
System.out.println(sumInt(1, 2));
System.out.println(sumLong(1, 4L));
System.out.println(sumDouble(2, 2.4));// 重载调用 System.out.println(sum(1, 1)); System.out.println(sum(1, 2L)); System.out.println(sum(1, 2.3));
}
public static int sumInt(int a ,int b){
return a+b;
}
public static long sumLong(long a ,long b){
return a+b;
}
public static double sumDouble(double a ,double b){
return a+b;
}
// 重载之后 , 名字一致
public static int sum(int a , int b){
return a+b;
}
public static long sum(long a , long b){
return a+b;
}
public static double sum(double a , double b){
return a+b;
}public static void m1(double q){
}
int m1(int i){
return 1;
}
}