Java程序设计的基本结构 - 循环结构

简介: Java程序设计的基本结构 - 循环结构

一、循环的基本结构

为了讲解方便,我们可以将循环结构划分为四个部分来进行描述。当然,这四个部分并不是都要出现,甚至在都不出现时也可以构成一个循环结构。并且,对于不同的循环结构,每个部分的相对位置也不同。

1. 初始化部分

在进入循环结构之前可以定义一些循环中以及循环结束后都要用到的变量,进行赋值。

2. 判断条件部分

用于决定是否继续进行循环,如果为假,则循环结束。判断部分可以直接使用一个布尔类型的变量,或者使用表达式,但是必须保证表达式的结果为布尔类型。

3. 循环体部分

循环结构的核心部分,用于书写每次想要重复执行的代码,通常要根据程序功能来设计。

4. 迭代部分

用于辅助控制循环的结束,在循环体之后执行,如变量自增等。

与判断结构类似,当不使用大括号时,循环结构只能控制一行代码,通常我们会添加大括号

二、while循环

1. 循环结构

[初始化部分]
while(条件判断部分){
    循环体
    [迭代部分]
}

2. 循环特点

对于while循环,通常用于循环次数不确定时,如:让使用者决定什么时候退出循环。

  • 可以用一个布尔变量直接来决定循环是否继续
  • 可以用break关键字随时跳出循环
  • 当条件判断部分不成立时结束循环
  • 初始化部分和迭代部分可以省略
  • 条件判断部分后如果出现分号会导致结构直接结束

3. 示例程序

  • 循环输出1到9
public static void main(String[] args){
    // 初始化部分
    int i = 1;
    // 括号中为循环继续执行的条件:当i的值小于等于9时
    while(i <= 9){
        // 循环体部分
        System.out.println(i);
        // 迭代部分:辅助控制循环结束或根据循环体的需要来写
        i++;
    }
}
  • 猜字程序
import java.util.Scanner;
import java.util.Random;
public class Test{
    public static void main(String[] args){
        // 初始化Scanner,用于从键盘读入数据
        Scanner sc = new Scanner(System.in);
        // 初始化随机数生成工具
        Random random = new Random();
        // 随机生成一个0~99的整数
        int n = random.nextInt(100);
        // 定义一个布尔类型的变量,用于控制循环的结束
        boolean flag = true; 
        // 使用flag作为控制循环结束的变量       
        while(flag){
            System.out.println("请输入一个数:");
            // 从键盘读取一个数
            int temp = sc.nextInt();
            // 判断输入的数是否与随机数相同,猜中则退出
            if(temp == n){
                System.out.println("猜中了!");
                // 修改flag为false,使得循环退出        
                flag = false;
            }else{
                // 如果没有猜中,就让用户自己决定是不是要继续猜
                System.out.println("猜错了!还要继续吗?1:继续2:退出");
                // 如果输入的数字为2则退出(此处暂不考虑输入出错等其他情况)
                if(sc.nextInt() == 2){
                    // 修改flag为false,使得循环退出        
                    flag = false;
                }
            }
        }
        // 使用后关闭
        sc.close();
    }
}

三、do-while循环

1. 循环结构

[初始化部分]
do{
    循环体
    [迭代部分]
}while(条件判断部分);

2. 循环特点

do-while循环与while循环的用法基本相同,主要的不同点在于循环体(迭代部分)一定会先执行一次,然后再进行判断,这非常适合在初学时做成菜单程序。

  • 可以用一个布尔变量直接来决定循环是否继续
  • 可以用break关键字随时跳出循环
  • 当条件判断部分不成立时结束循环
  • 初始化部分和迭代部分可以省略

3. 示例程序

  • 菜单程序

break只能跳出离自己最近一层的switch-case或循环结构,如果想直接跳出指定层的循环,需要使用到自定义标签。自定义标签的用法比较简单,直接在一个循环结构的起始位置加一个单词,配合冒号使用,在进行跳出时,可以在break后面添加自定义标签的名称,即可跳出指定层的循环。

import java.util.Scanner;
public class Test{
    public static void main(String[] args){
        // 初始化Scanner,用于从键盘读入数据
        Scanner sc = new Scanner(System.in);
        // 在此处使用自定义标签out(名称可以自定义)来进行标记
        out:do{
            System.out.println("****欢迎使用xxx系统****");
            System.out.println("****1.系统功能一*******");
            System.out.println("****2.系统功能二*******");
            System.out.println("****3.退出系统*********");
            System.out.print("请输入功能选项:");
            // 从键盘读入一个数选择要执行的功能
            int select = sc.nextInt();
            switch(select){
                case 1:
                    // 功能一相关代码
                    break;
                case 2:
                    // 功能二相关代码
                    break;
                case 3:
                    // 指定跳出外层的do-while循环,否则只能跳出当前的switch-case结构
                    break out;
            }
        // 判断条件一直为真,除非用户输入选项3退出系统,则使用break跳出。
        }while(true);
        // 使用后关闭
        sc.close();
    }
}

四、for循环

1. 循环结构

for(初始化部分;条件判断部分;迭代部分){
    循环体
}

2. 循环特点

for循环主要用于循环次数确定的情况,通常使用break直接跳出循环是由于已经完成了所需工作,终止剩余无用循环以提高程序运行效率。

  • for循环的一个明显特点在于初始化部分,迭代部分的控制比较方便,可以完全在循环内部完成
  • 初始化部分写在小括号中第一个位置,只会执行一次
  • 如果在初始化部分声明一个新的变量,则该变量只能在循环内部使用
  • 判断条件出现在小括号的中间位置,可以是布尔类型的变量或表达式,也可以直接省略使用break关键字手动跳出
  • 迭代部分通常用于变量的控制,每次循环体结束后执行
  • continue关键字可以用于所有的循环结构,作用是立即结束当前循环(跳过循环体的剩余部分内容,迭代部分依然会执行),进入下一次循环

3. 示例程序

  • 计算整数1~10的加和
public static void main(String[] args){
    // 定义一个整数类型变量,用于记录结果
    int sum = 0;
    for(int i = 1;i <= 10;i++){
        // 根据逻辑,将每次得到的值相加
        sum += i;
    }
    // 输出计算结果
    System.out.println(sum);
}
  • 输出整数0~100范围内的所有偶数
public static void main(String[] args){
    for(int i = 0;i <= 100;i++){
        // 判断当前数字的奇偶性,如果是奇数则跳过输出语句
        if(i % 2 != 0){
            // 如果是奇数,将跳过循环体剩余的部分,迭代部分不受影响
            continue;
        }
        System.out.println(i);
    }
    // 输出计算结果
    System.out.println(sum);
}

五、死循环

死循环的出现是由于我们没有正确的指定循环的终止条件和控制相关的变量,导致判断条件部分一直为真,使得循环结构无法结束。但有些时候根据功能需要我们会手动先构造一个死循环,然后使用break来进行跳出,如:菜单程序,由用户来决定什么时候结束,进行循环的跳出。手动构建一个死循环十分简单,但是如果意外的出现死循环就需要优先检查条件判断部分以及相关变量的变化了。

1. while循环

while(true){
    循环体
}

2. do-while循环

do{
    循环体
}while(true)

3. for循环

// 是的,你没有看错,所有的部分都不需要填写,但是分号不能省略
for(;;){
    循环体
}


目录
相关文章
|
7月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
194 0
|
11月前
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
362 0
|
11月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
11月前
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白
329 22
|
11月前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
438 5
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
207 3
|
Java 测试技术 开发者
💡Java 零基础:彻底掌握 for 循环,打造高效程序设计
【10月更文挑战第15天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
444 63
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
247 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
263 1
|
5月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案