目录
1.2.2.3.多分枝结构if...else if...else
一、流程控制
在所有的语言中,流程控制一共分为三种:顺序结构、选择结构、循环结构
1.1.顺序结构
程序是自上而下逐行代码来一步一步开始执行。
1.2.选择结构
1.2.1.switch语句
语法结构
switch (i) {
case 1 :
执行代码1;
break;
case 2 :
执行代码2;
break;
......
default:
执行代码n;
break;
};
执行流程
1.判断传入的值和case后面跟的值是否相等,当相等时,执行该条case后面的执行语句,如果执行语句中没有break,就会产生穿透效应,不进行判断,直接执行下一条case中的执行语句;直到执行到下一条break语句或是执行完整个switch
2.case语句的顺序可以打乱,default的判定条件是,所有的case都不满足时,才是判定成功;否则就会判定失败。
3.default可以被穿透,因此,当我们不在末尾使用default的时候,需要注意穿透效果。
注意事项
1.在switch语句中,switch语句后面的()中输入的变量会被默认转换成int类型,也就是说,不能默认转换成int类型的数据类型是回导致类型转换出错的。
2.case中的判断条件的类型要和判断的数据类型保持一致,而且只能是常量或是字面量。
3.switch可以判断的类型有byte、short、int、char、在jdk1.5以后还可以判断枚举类型enum;在jdk1.7以后加入了对String类型的判断。
4.switch本质上是一个等值判定
1.2.2.if 语句
if语句实际上是一个对区间的判断。
1.2.2.1.单分支结构if
语法结构
if (表达式) {
执行代码;
}
执行流程
1.计算表达式的值,值为true,进入步骤2;为false,跳出整个if语句,执行if语句以下的代码段。
2.执行if语句中的执行代码,当执行完毕后,顺序执行if语句以下的代码段。
注意事项
1.当我们需要的分支数很多的时候,单纯的一个if语句并不足以满足我们的需求。
2.表达式的值必须是一个boolean类型的值
1.2.2.2.双分支结构if...else
语法结构
if (表达式) {
执行代码1;
}else{
执行代码2;
}
执行流程
1.计算表达式的值。值为true,进入步骤2;为false,进入步骤3
2.执行if代码后的{}中的执行代码,也就是执行代码1;执行代码1执行完毕后,跳出整个if语句,执行if语句之后的代码段
3.执行else代码后的{}中的执行代码,也就是执行代码2;代码2执行完毕后,执行整个if语句之后的代码段
注意事项
1.当我们可以把所有的分支都并合成为两种情况的时候,我们就需要使用这种if语句。
1.2.2.3.多分枝结构if...else if...else
语法结构
if (表达式1) {
执行代码1;
}else if (表达式2) {
执行代码2;
}else if (表达式3) {
执行代码3;
//可以写多个else if(根据需求)
}else{
执行代码n;
}
执行流程
1.计算表达式1的值,值为true,进入步骤2;值为false,进入步骤3
2.执行离当前表达式最近的一个代码段,进入下一个if判断;(注意,实质上讲,我们在设定条件的时候,是不能重合的,因此,表现出来的是,跳出整个if语句,执行if语句之后的代码段)
3.执行下一个if判断,值为true,进入步骤2;当所有if判断都不符合时,进入步骤4
4.跳出整个if语句,执行if语句之后的代码段。
注意事项
1.我们的else if语句可以写多个,但是一般我们最多写三个条件。
2.值得注意的是,我们编写表达式的判定条件的时候,不要将其范围进行重合。否则会出现跟switch一样的穿透效应。
3.我们的多分支if语句可以变相的看成是if语句的循环嵌套。
1.3.循环结构
1.3.1.while循环
语法结构
while (表达式) {
循环体;
};
执行顺序
1.计算表达式的值,值为true,执行一次循环体;值为false,退出整个while循环,执行整个while循环之后的代码段
2.每次执行循环体之后,都需要再次重新进行步骤1,直到退出整个while循环
注意事项
1.在循环体中,我们在每次循环的同时,需要设置一个更新表达式,用来更新我们的表达式的值,否则会造成死循环。
2.表达式的值是一个boolean类型的值
1.3.2.do...while循环
语法结构
do {
循环体;
}while (表达式);
执行顺序
1.执行循环体一次
2.判断表达式的值,值为true,返回步骤1;值为false,退出整个do...while循环,执行循环之后的代码段。
注意事项
1.do...while循环中的循环体至少会执行一次
2.在while循环和do...while循环的选择上,当我们的表达式判定条件是需要执行一次循环体之后的数据时,就采用do...while;否则使用while
1.3.3.for循环
在for循环中,为我们提供了专门的位置存放我们的三个表达式:初始化表达式、条件表达式、更新表达式。
语法结构
for (初始化表达式; 条件表达式; 更新表达式) {
循环体(代码段);
}
for (let i = 0; i < 10; i++) {
循环体(代码段);
}
执行顺序
1.执行初始化表达式,初始化变量
2.执行条件表达式,判断是否执行循环
true,执行循环
false,终止循环
3.执行更新表达式,更新表达式执行完毕,重复第2步
注意事项
1.for循环的三个部分都可以省略,我们可以把初始化表达式写到for循环外部,或是将更新表达式写入循环体中。
2.三者都不写,只写两个;;此时循环,是一个死循环,一直执行下去。
1.3.4.for和while的选择
当我们不能确定整个循环的具体次数的时候,我们就使用while循环,否则使用for循环
1.4.break、continue、return
1.4.1.break
跳出整个循环体
1.4.2.continue
跳出当前本次循环
1.4.3.return
跳出整个方法
二、方法
所谓的方法就是一段代码集合,这段代码能够实现某个功能。
2.1.为什么使用方法?
当我们将某个功能封装成一个方法的时候,下次我们或者其他人要完成同样的功能的时候,就可以直接拿来这个方法来使用就可以了。
本质上,方法就是进行相同的处理的代码的集合。
2.2.方法的创建
2.2.1.主方法
主方法就是我们的main方法,我们的main方法的定义方式是定死的,除了形参的参数名以外,其他的都不允许更改
在一个类中,不可以有多个主方法。
2.2.2.自定义方法
自定义方法,就是自己定义的方法,方法要实现的功能以及代码全部都是由自己编写的
我们也可以定义一个方法,该方法的方法名为main,但是他不是主方法
编写位置
在一个类的类体中编写,与main方法同级别
编写方式
修饰符 [static] {void|数据类型} 方法名 ([参数列表]) {
方法体;
}
public static void add() {
方法体;
}
修饰符:描述该方法的访问权限
static:静态的 共享的 唯一的 隶属于类的 ,当类被加载的时候,这个静态内容也会被加载,且只加载一次
方法名:符合表示符的命名规则
2.3.参数列表
当我们编写一个方法的时候,我们有时候需要这个方法对不同的对象进行相同的处理。比如,我们有一个方法可以得到两个数相加之和,但是我们有时需要10和20的和,有时需要30和40的和,此时就需要使用我们的参数了。
所谓的参数,就是有我们人为的在调用方法的时候,给这个方法提供一些数,让该方法可以依据这些数来执行代码,得到我们最终想要的结果。就比如上面的例子,我们在调用方法的时候就告诉这个方法,我们需要计算的时10和20还是30和40.
形参:被调用者声明的部分
实参:调用时实际传入的部分
注意:
1.形参和实参的参数类型、参数个数、参数顺序,必须保持一致
2.对于被调用者来说,方法的形参只需要声明,不需要赋值,因为赋值时在方法被调用的时候给出的
2.4.方法的使用
我们使用编写的java程序的入口是我们的main方法。所以,当我们需要使用到我们的自定义方法的时候,我们就需要在main方法中调用我们所创建的自定义方法,
2.4.1.static修饰的方法
1.在同一个类中,我们可以直接通过方法名来调用
public static void main(String[] args) {
add();
}
2.在同一个包下的不同的类文件中,我们需要通过类名.方法名()的方式来指定我们想要调用的方法
3.在一个包下调用其他包下的某个方法的时候,我们就需要将这个方法所在的类导入到该类中,再通过类名.方法名()
2.4.2.非static修饰的方法
对于非static修饰的方法,我们在调用的时候需要先将方法所在的类实例化,在通过这个实例化对象来使用。
以上三种情况中,我们都需要使用实例化对象来使用我们想要的方法。
public static void main(String[] args) {
add();
}
我们可以看到,当我们使用了方法名来调用的时候,显示红色波浪号,说明我们仅仅使用方法名调用是错误的,这是因为,我们使用的方法名在java看来可能是一个为声明的变量;所以我们需要在方法名的后面添加()来告诉编译器,这里是一个方法。
2.5.方法的返回值
所谓的方法的返回值就是我们使用的方法返回给我们的一个值。
2.5.1.为什么需要返回值?
当我们使用了一个方法来实现某一个功能的时候,我们需要他来给我们提供一个返回值。就比如,我们先计算两个数的和,然后需要使用这个和来进行下一步的计算;如果我们使用方法计算两个数的和,那么得到最终计算出来的这个值我们需要拿到。此时,我们就需要使用到返回值了。
返回值不是必要的
当我们的业务需求中不需要使用到我们通过方法的到的结果的时候就不需要返回值了。就比如,我们只是计算两个数的和,将和输出到控制台,这个行为是可以直接在方法中输出的,且后续的代码中也永不到这个和,此时就不需要返回值。
2.5.2.返回值的类型
返回值的类型是依据我们实际需要的类型的,当我们需要的返回值类型为int类型,那么我们创建的方法的返回值类型就可以是int类型。
返回值的类型通过[void|数据类型]来指定。
2.5.3.return
Java中使用return语句来讲结果返回。需要返回的返回值直接跟在return语句的后面即可。
return 50;//将int类型字面量返回
2.6.重载
2.6.1.为什么要使用重载?
当我们两个方法的功能极为相似的时候,比如,计算两个数的和的方法和计算三个数的和的方法,这两个方法的功能就极为相似,但是两者的参数是不同的,所以,在没有重载的时候,我们需要创建两个不同的方法。
此时,我们就产生了一个疑惑,方法名是需要做到见名知意的,都是做加法,就算我们可以找到一些相同意思的单词,但是我们所需要的方法名的数量只会比我们所找到的要多得多。不仅如此,我们还需要对每个方法名做好区分,以免使用错误。这无疑是不合理的。
如果,我们可以把这个方法名复用呢?
使用同一个方法名,但是参数列表不同,这样对应的调用不同的方法不是就可以完美的解决我们上面所说的问题了?
这就是我们所说的重载。
将极为相似的功能使用相同的方法名,通过参数列表的区别来调用不同的方法。
2.6.2.重载特点
两同
类名相同,方法名相同
我们可以看到类名相同,所以也就不难想到,如果一个方法是被重载过的,那么方法本身以及所有重载的方法一般都是放在同一个类中的。
三不同
参数类型不同;参数个数不同;参数顺序不同
2.7.递归
递归是一种编程技巧,通过调用自身来完成一些我们使用其他方式较难实现的效果。
递归并不是必须使用的,它只是一种技巧,我们可以依据实际情况来进行判断,在有些情况下,使用递归可以帮助我们更简单的完成代码,但是并不一定是高效的
2.7.1.递归的缺点
1.递归的使用较为占用内存而且耗时一般很长
2.如果将递归程序的最后调用放置到整个递归程序的末尾,会大大增加程序的运行效率,这种方式被称为尾递归
3.尾递归和尾调用是不一样的,Java不支持尾递归,js支持尾递归
三、总结
3.1.错误信息同一行
在java中,我们的一个错误是有可能报错很多个,因此,我们不要看到很多错误就头疼,可能你的错误只有一个哦。
3.2.初始化赋值的本质
初始化赋值是把一个字面量赋值给我们的变量,这个变量是有一个数据类型的。
我们所谓的赋值除了long以及float以外,都是把一个int字面量或是double类型字面量赋值给变量,后台会帮我们进行数据类型的绑定,将该变量绑定成我们所需要的数据类型。
3.3.获取用户输入
1.在当前类的上方编写import代码
//编写代码
import java.util.Scanner;
//当前类
public class test {
}
2.获取当前Scanner对象 创建一个Sanner类型的变量
Scanner input = new Scanner(System.in);
3.获取用户输入的值
int num = input.nextInt();