在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
流程控制语句分类:顺序结构、选择结构、循环结构
是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
总的来说:写在前面的先执行,写在后面的后执行
选择结构也被称为分支结构。选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
Java语言提供了两种选择结构语句:(1)if语句(2)switch语句
if语句有三种格式
if语句第一种格式:
if(关系表达式) { 语句体 }执行流程:
首先判断关系表达式看其结果是true还是false如果是true就执行语句体如果是false就不执行语句体注意事项:
关系表达式无论简单还是复杂,结果必须是boolean类型if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。一般来说:有左大括号就没有分号,有分号就没有左大括号if语句第二种格式:
if(关系表达式) { 语句体1; }else { 语句体2; }执行流程:
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
/* if语句格式2的练习: A:获取两个数据中较大的值 B:判断一个数据是奇数还是偶数,并输出是奇数还是偶数 */ import java.util.Scanner; class IfTest { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); //获取两个数据中较大的值 System.out.println("请输入第一个数据:"); int a = sc.nextInt(); System.out.println("请输入第二个数据:"); int b = sc.nextInt(); //定义一个变量接收最大值 int max; if(a > b) { max = a; }else { max = b; } System.out.println("max:"+max); System.out.println("----------------"); //判断一个数据是奇数还是偶数 System.out.println("请输入你要判断的数据:"); int x = sc.nextInt(); if(x%2 == 0) { System.out.println(x+"这个数据是偶数"); }else { System.out.println(x+"这个数据是奇数"); } } }运行结果:
if语句第三种格式:
if(关系表达式1) { 语句体1; }else if (关系表达式2) { 语句体2; } … else { 语句体n+1; }执行流程:
首先判断关系表达式1看其结果是true还是false如果是true就执行语句体1如果是false就继续判断关系表达式2看其结果是true还是false如果是true就执行语句体2如果是false就继续判断关系表达式…看其结果是true还是false …如果没有任何关系表达式为true,就执行语句体n+1。 /* 三种if语句分别适合做什么事情呢? 格式1:适合做单个判断 格式2:适合做两个判断 格式3:适合做多个判断 需求: 键盘录入x的值,计算出y的并输出。 x>=3 y = 2x + 1; -1<=x<3 y = 2x; x<=-1 y = 2x – 1; 分析: A:由于数据要键盘录入,所以必须使用Scanner。 B:由于是三种判断,所以我们选择if语句格式3。 */ import java.util.Scanner; class IfTest2 { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入x的值:"); int x = sc.nextInt(); //定义一个y int y; //用if语句格式3进行判断 if(x >= 3) { y = 2*x + 1; }else if(x>=-1 && x<3) { y = 2*x; }else { y = 2*x - 1; } System.out.println("y:"+y); } }运行结果:
switch语句格式:
switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; … default: 语句体n+1; break; }格式解释
switch表示这是switch语句 表达式的取值:byte,short,int,charJDK5以后可以是枚举JDK7以后可以是Stringcase后面跟的是要和表达式进行比较的值语句体部分可以是一条或多条语句break表示中断,结束的意思,可以结束switch语句default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。执行流程
首先计算出表达式的值其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。 /* 用switch语句实现键盘录入月份,输出对应的季节 分析: A:键盘录入一个月份,用Scanner实现 B:用switch语句实现即可 */ import java.util.Scanner; class SwitchTest4 { public static void main(String[] args) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); //录入数据 System.out.println("请输入月份(1-12):"); int month = sc.nextInt(); //case穿透 switch(month) { case 1: case 2: case 12: System.out.println("冬季"); break; case 3: case 4: case 5: System.out.println("春季"); break; case 6: case 7: case 8: System.out.println("夏季"); break; case 9: case 10: case 11: System.out.println("秋季"); break; default: System.out.println("你输入的月份有误"); } } }运行结果:
(3)if语句和switch语句的区别? if语句:
A:针对结果是boolean类型的判断B:针对一个范围的判断C:针对几个常量值的判断switch语句:针对几个常量值的判断
注意事项:
case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的default可以省略吗?可以省略。一般不建议。除非判断的值是固定的。break可以省略吗?可以省略,一般不建议。否则结果可能不是你想要的default的位置一定要在最后吗?可以出现在switch语句任意位置。switch语句的结束条件,遇到break执行到程序的末尾循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
执行流程
执行初始化语句执行判断条件语句,看其结果是true还是false 如果是false,循环结束如果是true,继续执行执行循环体语句执行控制条件语句回到B继续注意事项
判断条件语句的结果是一个boolean类型
循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
一般来说:有左大括号就没有分号,有分号就没有左大括号
运行结果:
运行结果:
for循环语句和while循环语句可以等价转换,但还是有些小区别的
使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。场景区别:for循环适合针对一个范围判断进行操作,while循环适合判断次数不明确操作 /* 练习:用while循环实现 左边:求出1-100之和 右边:统计水仙花数有多少个 初始化语句; while(判断条件语句) { 循环体语句; 控制条件语句; } for(初始化语句;判断条件语句;控制条件语句) { 循环体语句; } */ class WhileDemo2 { public static void main(String[] args) { //求出1-100之和 //for语句版本 int sum = 0; for(int x=1; x<=100; x++) { sum+=x; } System.out.println("sum:"+sum); System.out.println("--------"); //while语句版本 int sum2 = 0; int y=1; while(y<=100) { sum2+=y; y++; } System.out.println("sum2:"+sum2); System.out.println("--------"); } }运行结果:
/* 需求:统计水仙花数有多少个 */ class WhileDemo3 { public static void main(String[] args) { //for循环版本 int count = 0; for(int x=100; x<1000; x++) { int ge = x%10; int shi = x/10%10; int bai = x/10/10%10; if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) { count++; } } System.out.println("count:"+count); System.out.println("------------"); //while循环版本 int count2 = 0; int y = 100; while(y<1000) { int ge = y%10; int shi = y/10%10; int bai = y/10/10%10; if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == y) { count2++; } y++; } System.out.println("count2:"+count2); } }运行结果:
使用区别:如果你想在循环结束后,继续使用控制条件的那个变量,用while循环,否则用for循环。不知道用for循环。因为变量及早的从内存中消失,可以提高内存的使用效率。
其实还有一种场景的理解: 如果是一个范围的,用for循环非常明确。 如果是不明确要做多少次,用while循环较为合适。举例:吃葡萄。
class WhileDemo4 { public static void main(String[] args) { //for循环实现 for(int x=0; x<10; x++) { System.out.println("学习Java技术哪家强,中国北京传智播客"); } //这里不能在继续访问了 //System.out.println(x); //while循环实现 int y = 0; while(y<10) { System.out.println("学习Java技术哪家强,中国北京传智播客"); y++; } //这里是可以继续访问的 System.out.println(y); } }注意死循环:
A:一定要注意控制条件语句控制的那个变量的问题,不要弄丢了,否则就容易死循环。 B:两种最简单的死循环格式
while(true){...} for(;;){...}代码示例:九九表
/* 需求:在控制台输出九九乘法表。 首先我们写出九九乘法表: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 ... 1*9=9 2*9=18 3*9=27 ... 我们先把这个九九乘法表看出是这样的一个形状: * ** *** **** ***** ****** ******* ******** ********* 注意: '\x' x表示任意,这种做法叫转移字符。 '\t' tab键的位置 '\r' 回车 '\n' 换行 */ class ForForDemo3 { public static void main(String[] args) { for(int x=0; x<9; x++) { for(int y=0; y<=x; y++) { System.out.print("*"); } System.out.println(); } System.out.println("--------------"); //为了使用数据,我们从1开始 for(int x=1; x<=9; x++) { for(int y=1; y<=x; y++) { System.out.print(y+"*"+x+"="+y*x+"\t"); } System.out.println(); } } }运行结果:
Java中的goto是保留字,目前不能使用。虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情。为了弥补这个缺陷,Java就提供了break,continue和return来实现控制语句的跳转和中断。
break 中断、continue 继续、return 返回
不是为了跳转出循环体,更常用的功能是结束一个方法,也就是退出一个方法。跳转到上层调用的方法。这个在方法的使用那里会在详细的讲解
/* return:返回 其实它的作用不是结束循环的,而是结束方法的。 */ class ReturnDemo { public static void main(String[] args) { for(int x=0; x<10; x++) { if(x == 2) { System.out.println("退出"); //break; //continue; return; } System.out.println(x); } System.out.println("over"); } }假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹(植物大战僵尸)。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个方法,程序在需要发射炮弹时调用该方法即可。
1、简单的说:方法就是完成特定功能的代码块 在很多语言里面都有函数的定义,函数在Java中被称为方法 2、格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; return 返回值; }注意事项:
方法不调用不执行方法与方法是平级关系,不能嵌套定义方法定义的时候参数之间用逗号隔开方法调用的时候不用在传递数据类型如果方法有明确的返回值,一定要有return带回一个值方法重载概述
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
方法重载特点
与返回值类型无关,只看方法名和参数列表 在调用时,虚拟机通过参数列表的不同来区分同名方法
/* 比较两个数据是否相等。参数类型分别为 两个byte类型,两个short类型,两个int类型,两个long类型, 并在main方法中进行测试 */ class FunctionTest6 { public static void main(String[] args) { //测试 byte b1 = 3; byte b2 = 4; System.out.println("byte:"+compare(b1,b2)); //测试 short s1 = 5; short s2 = 5; System.out.println("short:"+compare(s1,s2)); //后面的两个自己测试 } //byte类型 public static boolean compare(byte a,byte b) { System.out.println("byte"); return a == b; } //short类型 public static boolean compare(short a,short b) { System.out.println("short"); return a == b; } //int类型 public static boolean compare(int a,int b) { System.out.println("int"); return a == b; } //long类型 public static boolean compare(long a,long b) { System.out.println("long"); return a == b; } }运行结果:
需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用
那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:
数组是存储多个变量(元素)的东西(容器)这多个变量的数据类型要一致格式1:数据类型[] 数组名; 格式2:数据类型 数组名[]; 注意:这两种定义做完了,数组中是没有元素值的
格式:数据类型[] 数组名 = new 数据类型[数组长度]; 数组长度其实就是数组中元素的个数。 举例:int[] arr = new int[3]; 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。
Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈 存储局部变量堆 存储new出来的东西方法区 (面向对象部分讲)本地方法区 (和系统相关)寄存器 (给CPU使用)图解1:定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。
图解2:定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。
图解3:定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…}; 举例:int[] arr = new int[]{1,2,3}; 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3。 其实这种写法还有一个简化的写法:int[] arr = {1,2,3};
我们传智播客的Java基础班每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个Java基础班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。由此可见:其实二维数组其实就是一个元素为一维数组的数组。
二维数组定义格式 (1)格式1
数据类型[][] 变量名 = new 数据类型[m][n]; // m表示这个二维数组有多少个一维数组 // n表示每一个一维数组的元素个数举例:
int[][] arr = new int[3][2]; // 定义了一个二维数组arr // 这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2] // 每个一维数组有2个元素,可以通过arr[m][n]来获取 // 表示获取第m+1个一维数组的第n+1个元素(2)格式2
数据类型[][] 变量名 = new 数据类型[m][]; // m表示这个二维数组有多少个一维数组 // 这一次没有直接给出一维数组的元素个数,可以动态的给出。举例:
int[][] arr = new int[3][]; arr[0] = new int[2]; arr[1] = new int[3] arr[2] = new int[1];(3)格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}}; 简化版格式:数据类型[][] 变量名 = {{元素…},{元素…},{元素…}}; 举例:int[][] arr = {{1,2,3},{4,6},{6}};运行结果:
运行结果:
运行结果: