在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
程序的执行顺序:
书写的.java文件,称为Java的源代码(源程序)。
源代码需要使用JDK 中提供的 javac 命令进行编译。在dos窗口中输入的javac 源文件名.java 这时是在启动编译器,然后让编译器去检查当前的源代码有没有语法错误。没有语法错误,就会生成class文件。
然后我们在dos窗口中输入java class文件名 这时会启动JVM。启动JVM之后,JVM会在我们的内存中划分出空间,来运行当前的Java程序。JVM会先把硬盘上的class文件加载到内存划分好的空间中。JVM开始在当前这个class文件中找main方法运行。然后开始运行main方法。
在main方法中:开始执行main方法中的代码,从上往下逐行执行。在执行的过程中,JVM遇到不同的关键字,需要做不同的事情。程序是按照顺序结构在执行。程序中大多数的代码都是这样执行的。
public static void main(String[] args){
//顺序执行,根据编写的顺序,从上到下运行
System.out.println(1);
System.out.println(2);
System.out.println(3);
}
注意:程序在执行的过程中,不可能完全按照行的方式,每行都执行。在执行的过程中,应该加入一些复杂的条件,保证在满足的情况下,执行某些动作或者命令,如果不满足,就跳过执行其他的程序或者还有一种情况就是重复的一直执行某块代码。
程序在执行的过程中,需要加入一些条件,然后根据条件的真假,确定应该执行哪些代码,不应该执行哪些代码, 要完成这个需求,就必须使用Java中的判断结构。
if(判断条件){
语句体;
}
执行流程
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体
如果是false就不执行语句体
需求:判断一个整数是偶数还是奇数
public static void main(String[] args){
// 定义变量
int a = 10;
//变量使用if判断
if (a % 2 == 0){
System.out.println("a是偶数");
}
if(a % 2 == 1){
System.out.println("a是奇数");
}
System.out.println("结束");
}
执行流程如下所示:
if(关系表达式) {
语句体1;
}else {
语句体2;
}
执行流程
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
注意:如果if成立了,执行完if后面的语句之后,直接跳过else,不会执行else后面大括号中的内容,而是往下继续执行。
案例:比较两个数的大小。
class IfElseDemo
{
public static void main(String[] args)
{
//if else 举例
int a = 3;
int b = 6;
//假设不考虑 a 和 b 相等的情况
if( a > b )
{
System.out.println("a大于b");
}
else
{
System.out.println("b大于a");
}
System.out.println("Hello World!");
}
}
注意:这里不考虑 a 和 b 相等的情况
执行过程如下图所示:
注意:else 的语句执行时间是if判断的条件不成立时。else不需要书写条件。
在程序中只要有else,必然上方有if条件,但是有if条件,就不一定有else 了。
当在程序中有多个条件的时候,每个if只能列出其中的一种可能条件,这时在else中就会隐含其他的所有条件,对剩余的条件,还要进行更加具体的细化,这时可以在else 后面继续使用if,区分出其他的各种情况。
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
假设成绩x=98,如下:
int x=98
x>=90 && x<=100
分析:
1、定义变量保存学生成绩;
2、题目要求对成绩进行不同区间的划分,划分区间就需要使用比较运算结合 逻辑运算完成;
3、由于有多个区间,并且输出的内容都不一样,这时就需要使用if对这些区间进行逐一的区分,可以使用if esle if else 结构;
5、在哪个if判断成立之后,就输出对应的等级;
步骤:
1、定义变量保存学生成绩
2、使用判断进行区分
3、判断成立打印等级
class IfElseDemo3
{
public static void main(String[] args)
{
//1、定义变量保存学生成绩;
int score=98;
//划分区间
if(score>=90 && score<=100)
{
System.out.println("A");
}else if(score>=80 && score<=89){
System.out.println("B");
}else if(score>=70 && score<=79){
System.out.println("C");
}else if(score>=60 && score<=69){
System.out.println("D");
}else{
System.out.println("E");
}
System.out.println("Hello World!");
}
}
在某些简单的应用中,if语句是可以和三元运算符互换使用的。
public static void main(String[] args) {
int a = 10;
int b = 20;
//定义变量,保存a和b的较大值
int c;
if(a > b) {
c = a;
} else {
c = b;
}
//可以上述功能改写为三元运算符形式
c = a > b ? a:b;
}
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
要求这个表达式最后必须能计算出一个准确的结果,并且这个结果的类型只能是 byte short int char , 在JDK7以后增加了字符串类型。
break的作用是结束switch语句,跳出switch语句。
案例:根据指定的天数,打印星期。
/*
案例:根据指定的天数,打印星期。
*/
class SwitchTest
{
public static void main(String[] args)
{
int day = 7;
switch(day){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("没有这个星期");
break;
}
System.out.println("Hello World!");
}
}
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
public static void main(String[] args) {
int i = 5;
switch (i){
case 0:
System.out.println("执行case0");
break;
case 5:
System.out.println("执行case5");
case 10:
System.out.println("执行case10");
default:
System.out.println("执行default");
}
}
上述程序中,执行case5后,由于没有break语句,程序会一直向后走,不会在判断case,也不会理会break,直接运行完整体switch。
由于case存在穿透性,因此初学者在编写switch语句时,必须要写上break。
在生活中有时我们做某些事情,需要重复往复性的做好多次,根据具体的情况,最后才能决定是否还需要继续做这件事。
我们要想把生活中的这些重复性的动作在Java中体现出来,这时就需要使用Java提供的循环。
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
Java中提供的循环有三种:
for循环、while循环、do-while循环。
for(初始化表达式①; 布尔表达式②; 修改布尔表达式④){
循环体③
}
案例:使用循环在控制台输出10次HelloWorld
public static void main(String[] args) {
//控制台输出10次HelloWorld,不使用循环
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("-------------------------");
//用循环改进,循环10次
//定义变量从0开始,循环条件为<10
for(int x = 0; x < 10; x++) {
System.out.println("HelloWorld"+x);
}
}
public static void main(String[] args) {
//1.定义一个初始化变量,记录累加求和,初始值为0
int sum = 0;
//2.利用for循环获取1-100之间的数字
for (int i = 1; i <= 100; i++) {
//3.判断获取的数组是奇数还是偶数
if(i % 2==0){
//4.如果是偶数就累加求和
sum += i;
}
}
//5.循环结束之后,打印累加结果
System.out.println("sum:"+sum);
}
初始化表达式①
while(布尔表达式②){
循环体③
修改表达式④
}
while循环输出10次HelloWorld
public static void main(String[] args) {
//while循环实现打印10次HelloWorld
//定义初始化变量
int i = 1;
//循环条件<=10
while(i<=10){
System.out.println("HelloWorld");
//步进
i++;
}
}
while循环计算1-100之间的和
public static void main(String[] args) {
//使用while循环实现
//定义一个变量,记录累加求和
int sum = 0;
//定义初始化表达式
int i = 1;
//使用while循环让初始化表达式的值变化
while(i<=100){
//累加求和
sum += i ;
//步进表达式改变变量的值
i++;
}
//打印求和的变量
System.out.println("1-100的和是:"+sum);
}
初始化表达式①
do{
循环体③
修改表达式④
}while(布尔表达式②);
输出10次HelloWorld
public static void main(String[] args) {
int x=1;
do {
System.out.println("HelloWorld");
x++;
}while(x<=10);
}
do…while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。这样的循环具有一定的风险性,因此初学者不建议使用do…while循环。
public static void main(String[] args){
do{
System.out.println("无条件执行一次");
}while(false);
}
for
和 while
的小区别:
代码如下所示:
public class Demo2 {
public static void main(String[] args) {
for(int x=1; x<=5; x++){
System.out.println("爱生活,爱Java");
}
//这里的x无法继续访问
//System.out.println(x);
System.out.println("-----------------");
int y = 1;
while(y<=10) {
System.out.println("爱生活,爱Java");
y++;
}
System.out.println(y);
}
}
无限循环,也称为死循环。程序一直在执行这个循环,而永远不会停止。
一般我们书写循环的时候,都需要定义有效的变量,保证这个循环可以正常的结束。
无限循环的书写格式:
while的格式:
while( true )
{
循环体;
}
for的格式:
for( ; ; )
{
循环体;
}
注意:只要使用无限循环,那么在循环的下面不要再写任何的语句。
所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。
嵌套循环格式:
for(初始化表达式①; 循环条件②; 修改表达式⑦) { //外层循环
//外层循环体
for(初始化表达式③; 循环条件④; 修改表达式⑥) {//内层循环
//内层循环体
执行语句⑤;
}
}
嵌套循环执行流程:
练习:
/*
循环嵌套
*/
class ForForDemo
{
public static void main(String[] args)
{
//外层循环
for (int i=1;i<=2;i++)
{
//内层循环
for (int j=1;j<=2;j++)
{
System.out.println("i="+i+",j="+j);
}
}
System.out.println("Hello World!");
}
}
执行过程如下图所示:
总结:
针对循环嵌套:外循环执行一次,内部的循环要从头到尾彻底执行结束。如果在执行的过程中,内部循环没有执行完,是不会去执行外部循环的。
特别注意:内部循环的循环体执行完之后,需要进入到内部循环的表达式3(修改循环条件)中去继续执行。
使用场景:终止switch或者循环
break:它主要是在程序中跳出当前正在执行的代码。
break,它主要用在switch的case中,或者用在循环中。
当用在switch中的时候,在程序执行switch中的代码时候,遇到break,会导致当前这个switch代码彻底结束,而去执行和switch结构上并列的语句。
当break使用在循环中的时候,只要JVM遇见break,就立刻让当前循环结束,不管循环条件是否还成立,循环都会强制结束。
案例代码如下所示:
public static void main(String[] args) {
for (int i = 1; i<=10; i++) {
//需求:打印完两次HelloWorld之后结束循环
if(i == 3){
break;
}
System.out.println("HelloWorld"+i);
}
}
continue(继续):它主要用在循环中,不能使用在其他地方。(跳过本次循环,执行本循环的下一次的循环)
continue:它的执行原理:当在循环中遇到的continue,这时JVM 就不会再执行continue下面属于本循环的其他语句,而直接进入本循环的下次循环。
案例代码如下所示:
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
//需求:不打印第三次HelloWorld
if(i == 3){
continue;
}
System.out.println("HelloWorld"+i);
}
}