Java程序设计基础(微课版)(第2版)-课件 第3章 Java程序结构控制_第1页
Java程序设计基础(微课版)(第2版)-课件 第3章 Java程序结构控制_第2页
Java程序设计基础(微课版)(第2版)-课件 第3章 Java程序结构控制_第3页
Java程序设计基础(微课版)(第2版)-课件 第3章 Java程序结构控制_第4页
Java程序设计基础(微课版)(第2版)-课件 第3章 Java程序结构控制_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序设计基础第三章-Java程序结构控制主讲讲师

[教师姓名]授课时间

2026年3月本章学习目标流程控制语句掌握程序执行路径的核心逻辑,通过条件与循环实现动态执行,是编写智能程序的基础。重点掌握if/switch分支选择,while/for循环结构,以及break/continue灵活跳转的使用场景。数组学会高效存储和管理批量同类型数据,利用索引快速定位,大幅提升数据处理的效率。熟练运用一维与二维数组,理解对象数组的复杂存储,善用Arrays工具类简化开发工作。字符串深入理解Java中最常用的引用类型String,掌握其底层特性是处理文本数据的关键。吃透字符串不可变性原理,熟练掌握拼接、截取、查找等核心API方法的正确使用。方法实现代码的结构化与模块化,是提升代码复用性、可读性与维护性的重要编程手段。规范定义方法结构,理解值传递与引用传递的本质区别,学会封装业务逻辑。核心能力构建通过本章的学习,你将建立起结构化编程的核心思维。从基础的流程控制到复杂的数据结构(数组、字符串),再到代码的模块化设计(方法),这一系列知识点是构建复杂Java应用的基石。掌握这些内容后,你将具备独立编写逻辑严密、结构清晰且可维护的Java程序的能力,为后续面向对象编程和高级开发打下坚实基础。程序流程概述顺序结构这是程序设计中最基础、最自然的执行模式。代码如同流水一般,严格按照书写的先后顺序,从上到下逐行依次执行,没有任何跳跃或回头。核心特点:无需额外控制语句,逻辑简单直观,是所有复杂程序的基础组成单元。选择结构(分支)程序不再单一顺向执行,而是引入了“判断机制”。根据预设的条件表达式结果(真或假),动态选择执行不同的代码块,实现了逻辑的分支。关键实现:主要依赖if条件语句和switch多分支语句,让程序具备了“思考”和“决策”的能力。循环结构为了解决重复执行任务的问题而设计。只要满足指定的循环条件,就会反复执行一段代码块,直到条件不再满足时才会退出循环,继续后续逻辑。常用语句:while、do-while和for语句。这极大地简化了处理大量重复性工作的代码量。程序的执行并非总是线性的。这三种基本结构——顺序、选择和循环,是构建所有复杂Java应用程序的基石。通过灵活组合这三种结构,我们可以实现从简单计算到复杂业务逻辑的各种功能,让代码的执行路径变得可控且富有逻辑。选择语句-if语句if语句是编程中最基础也最常用的条件判断工具,它如同现实中的“岔路口”。程序会先计算布尔表达式的结果,如果结果为true,就执行对应的代码块;如果为false,则跳过该部分,让代码拥有了“自主思考”和“路径选择”的能力。简单if单分支if(condition){

//仅当条件为真时执行此处代码

}适用于“满足特定条件才做事,不满足就不做”的场景,如用户登录验证。if-else双分支if(condition){...}

else{

//条件为假时执行备用逻辑

}经典的“二选一”逻辑,非此即彼。例如判断考试是否及格,给出不同反馈。多重条件判断if(c1){...}

elseif(c2){...}

else{//兜底方案}处理多种可能性的场景,按顺序检查条件,找到第一个匹配项后执行并退出。实战示例:成绩等级智能判定根据学生的考试分数,通过多重条件判断,自动将分数映射为A、B、C、D、F五个等级。这是if-elseif-else语句在现实业务逻辑中最典型的应用场景之一。intscore=85;chargrade;

if(score>=90){grade='A';}

elseif(score>=80){grade='B';}//命中此分支

elseif(score>=70){grade='C';}

else{grade='F';}

System.out.println("等级:"+grade);//输出结果为B选择语句-switch语句switch语句提供了一种比if-elseif更结构化、更清晰的方式来处理多重条件分支。它专为对一个变量的多个固定值进行匹配判断的场景设计,能有效简化代码逻辑,提升程序的可读性与维护性。核心语法结构switch(expression){

casevalue1://匹配值1时执行

statement1;break;//break跳出分支

casevalue2://匹配值2时执行

statement2;break;

default://未匹配任何值时的默认逻辑

defaultStatement;

}使用关键规则类型限制支持byte/short/int/char、String及枚举类型常量匹配case后必须是编译期常量,不可使用变量break机制终止执行,省略会发生贯穿执行后续分支实战:根据数字判断星期几intday=3;switch(day){

case1:System.out.println("星期一");break;case2:System.out.println("星期二");break;

case3:System.out.println("星期三");break;default:System.out.println("无效数字");

}💡易错点提示如果省略break语句,程序不会退出switch,而是会发生“贯穿”现象,继续执行后续case的代码。这通常是bug的来源,除非是有意为之,否则务必加上break。循环语句-while循环核心逻辑:先判断,后执行while循环是一种基本的控制流语句,执行前会先对给定的条件进行布尔判断。若条件为true,则执行循环体代码;若条件一开始就为false,循环体将永不执行。这种特性使其非常适合用于次数不确定但有明确终止条件的场景。标准语法结构while(condition){

//当条件满足时,重复执行的代码块

}避坑指南务必在循环体内更新循环变量(如i++)。如果缺少更新步骤,条件将永远为true,导致程序进入无限循环,占用大量系统资源甚至导致程序崩溃。经典案例:累加求和计算1到100的整数和。利用循环变量从1递增到100,每次将当前值累加到总和变量中。inti=1,sum=0;//初始化计数器与结果

while(i<=100){sum+=i;i++;}//核心循环逻辑

System.out.println("1到100的和为:"+sum);//输出结果:5050循环语句-do-while循环不同于while循环的“先判断、后执行”,do-while循环采用“先执行循环体,再判断条件”的执行逻辑。这一特性决定了它最核心的优势:无论条件表达式的结果是true还是false,循环体中的代码至少会被执行一次,是处理“必须执行一次”业务场景的最佳选择。标准语法结构(Java)do{//循环体:需要重复执行的核心业务代码}while(condition);//注意:末尾必须有分号!//当condition为true时,回到do继续执行;否则退出循环典型应用:保底执行场景适用于“必须先做一次,再看结果”的情况。例如:用户交互中的输入验证(必须先提示输入)、菜单驱动程序(必须先显示菜单)、资源初始化操作(必须先加载资源再检查状态)等。实战:用户密码验证程序强制用户至少输入一次密码,系统接收输入后进行校验。如果输入错误,重复提示;直到输入“secret”为止,体现了“先执行、后判断”的核心逻辑。Stringinput;Scannersc=newScanner(System.in);do{System.out.print("请输入访问密码:");input=sc.nextLine();}while(!input.equals("secret"));//条件不满足则继续System.out.println("验证通过!欢迎进入系统。");循环语句-for循环for循环是编程中最常用的循环结构,它将初始化、条件判断和更新操作集中在同一行,结构紧凑且逻辑清晰。这种设计让循环的边界条件一目了然,特别适合处理已知循环次数的重复性任务,能有效提升代码的可读性与执行效率。核心语法结构for(initialization;condition;update){

//循环体:满足条件时重复执行的代码

}经典应用:九九乘法表利用嵌套for循环实现:外层循环控制行数(i),内层循环控制每行的列数(j)。通过行列变量的乘积计算,自动生成并格式化打印出标准的乘法口诀表,是掌握循环逻辑的经典入门案例。代码实现示例:for(inti=1;i<=9;i++){//外层循环:遍历1到9行

for(intj=1;j<=i;j++){//内层循环:每行打印i个式子

System.out.print(j+"*"+i+"="+(i*j)+"\t");//输出并对齐

}System.out.println();//换行进入下一行

}跳转语句-breakbreak语句是控制程序流程的关键工具,用于立即终止并跳出当前所在的最内层循环或switch语句。它能帮助我们在满足特定条件时,主动结束不必要的执行过程,避免程序陷入无效循环。基础用法:跳出当前单层循环for(inti=1;;i++){//无限循环

if(i%7==0){

System.out.println("找到目标数:"+i);

break;//触发后立即退出当前for循环

}

}在无限制的循环结构中,当检测到符合条件的数据时,执行break语句即可终止循环,是实现“找到即停止”逻辑的常用方式。进阶用法:带标签跳出外层循环outer:for(inti=0;i<3;i++){

for(intj=0;j<3;j++){

if(i==1&&j==1)breakouter;

System.out.print(i+","+j+"");

}

}针对嵌套循环场景,通过定义标签(如outer),break可穿透内层循环直接终止外层循环,实现跨层级的流程控制,减少冗余的条件判断。核心要点:break是“立即中断”型指令。无标签时仅作用于最近的循环或switch;配合标签使用时,可精准跳出指定的外层代码块,是优化多层循环执行效率的重要技巧。跳转语句-continue`continue`语句用于跳过当前循环的剩余语句,直接进入下一次循环迭代。它不会终止整个循环,而是让程序流程回到循环的条件判断部分,决定是否开始新的一轮循环,是优化循环逻辑、跳过特定情况的常用工具。基础场景:打印1-10间的奇数通过判断数字是否为偶数,若满足则执行`continue`跳过后续打印步骤,直接进入下一次循环,从而仅输出奇数。for(inti=1;i<=10;i++){

if(i%2==0)continue;//偶数则跳过本次循环

System.out.println(i);//仅执行奇数的打印

}进阶技巧:带标签的嵌套循环控制在多层嵌套循环中,普通`continue`仅作用于当前层。配合标签使用时,可以直接跳转到外层循环,实现更灵活的流程控制。outerLoop:for(inti=0;i<3;i++){

for(intj=0;j<3;j++){

if(j==1)continueouterLoop;//跳至外层

}

}核心区别:与`break`终止整个循环不同,`continue`的核心在于“跳过”而非“终止”。它保留了循环的结构,仅对单次迭代进行干预,在处理大量数据筛选、特定条件规避时,能显著提升代码的执行效率和可读性。数组的概念数组是一个用于存储相同数据类型元素的固定长度的有序集合。它是程序设计中最基础也最常用的数据结构之一,能够将多个同类型数据规整地组织在一起,方便统一管理与高效访问。相同类型数组中的所有元素必须属于同一种数据类型,例如全部为整数(int)、字符串(String)等。这种一致性是数组的核心规则,保证了数据处理的规范性,也让计算机能够以固定的步长在内存中连续寻址。固定长度数组在被初始化(创建)的那一刻,其长度就被永久确定,后续无法动态扩容或缩容。这意味着在使用前必须预估数据量,内存空间会一次性分配完毕,避免了运行时的内存碎片,也带来了访问速度上的优势。有序集合数组中的元素按顺序排列,每个元素都有一个唯一的数字索引(下标),且索引始终从数字0开始。通过索引,我们可以跳过前面的元素,直接定位并访问任意位置的数据,这也是数组实现O(1)随机访问的关键原因。一维数组-定义与初始化声明并分配空间先声明数组变量,再使用new关键字为其在内存中动态分配指定长度的连续空间,元素默认值为数据类型零值。int[]scores;//声明

scores=newint[5];

//分配5个int型空间

//默认值:{0,0,0,0,0}声明并初始化在声明的同时完成内存分配,并通过大括号显式指定初始元素值,数组长度由初始值的个数自动决定。String[]names=newString[]{

"Alice","Bob","Charlie"

};

//长度为3的字符串数组简化初始化(静态)这是最常用、最简洁的写法,称为静态初始化。编译器会根据上下文自动推断类型并分配内存,适合已知初始数据的场景。double[]prices={

19.99,29.99,39.99

};

//直接赋值,省略new关键字一维数组-访问与遍历元素访问:精准定位数据采用数组名[索引]的语法格式访问元素。索引从0开始计数,例如`arr[0]`代表第一个元素。这是从数组中读取或修改特定位置数据的最直接方式。属性获取:length动态度量通过数组名.length自动获取数组中元素的总个数。这一属性是动态的,当数组元素数量变化时会同步更新,常用于循环条件判断,避免手动计算的误差。实战一:累加计算数组总和int[]nums={1,2,3,4,5};

intsum=0;

for(inti=0;i<nums.length;i++){

sum+=nums[i];//累加每个元素

}

System.out.println("总和为:"+sum);//输出结果:15实战二:遍历输出月份天数int[]days={31,28,31,30,31,30,31,31,30,31,30,31};

for(inti=0;i<days.length;i++){

//循环输出每个月的天数

System.out.print("第"+(i+1)+"月:"+days[i]+"天");

}避坑指南数组索引必须大于等于0且小于数组长度。在编写循环时,务必将条件设为`i<数组名.length`,而非手动写死数值(如`i<10`),这能有效防止出现“数组越界”运行时异常,保证代码的健壮性。二维数组二维数组是一种特殊的数组结构,可以看作是“数组的数组”,在逻辑上呈现为行和列的表格形式(矩阵)。它非常适合存储具有二维结构的数据,例如学生成绩表、图像像素数据或矩阵运算数据,通过两个索引即可精准定位到目标元素。定义与静态初始化//定义一个3行4列的空二维数组

int[][]matrix=newint[3][4];

//静态初始化:直接赋值一个3行3列的成绩表

int[][]scores={{90,85,88},{78,92,80},{85,76,95}};

//结构上对应:行0→学生1,行1→学生2,行2→学生3索引访问与嵌套遍历//语法:数组名[行索引][列索引],索引从0开始

//嵌套for循环遍历:外层行,内层列

for(inti=0;i<scores.length;i++){

for(intj=0;j<scores[i].length;j++){

System.out.print(scores[i][j]+"");//输出每行元素

}System.out.println();//换行分隔行

}核心逻辑:二维数组的本质是线性结构的二次封装。在处理表格、矩阵等二维数据时,通过“先行后列”的索引规则和嵌套循环的遍历方式,能够高效地对数据进行存取和计算,是后续学习多维数据结构与算法的重要基础。对象数组数组的元素也可以是对象!数组中存储的并非对象实体本身,而是对象的引用(内存地址)。在使用时,需要先声明数组,再为每个数组元素手动创建具体的对象实例,最后才能访问对象的属性和方法。Java实现示例:学生信息对象数组Student[]students=newStudent[2];//1.声明引用类型数组students[0]=newStudent("张三",20);//2.实例化对象并赋值students[1]=newStudent("李四",21);//3.foreach循环遍历,直接操作对象for(Students:students){System.out.println("姓名:"++",年龄:"+s.age);}关键操作步骤声明数组容器:仅分配存储引用的内存,此时数组元素默认值为null。对象实例化:必须通过new关键字创建具体对象,否则会抛出空指针异常。💡核心认知:创建对象数组就像买了一排空的储物柜,数组是柜子本身,而对象是我们要放进去的物品。柜子买好了(声明数组),物品(对象)还需要我们一个个生产出来放进去,柜子里存的只是物品的“位置标签”(引用)。Arrays工具类java.util.Arrays类提供了一系列静态方法,用于便捷地操作数组。它封装了数组排序、转换、填充、复制和查找等核心逻辑,是Java开发中处理数组数据不可或缺的实用工具类,能有效简化代码并提升开发效率。Arrays.sort(array)对数组进行自然升序排序,支持int、String、Object等多种数据类型,是开发中最基础且高频使用的数组排序方法。Arrays.toString(array)将数组内容转换为"[元素1,元素2,...]"的直观字符串形式,替代直接打印数组内存地址,极大地方便了调试与日志输出。Arrays.fill(array,val)将数组的所有元素统一填充为指定值。常用于数组初始化、快速重置数据,或为新数组预设默认初始内容。Arrays.copyOf(original,newLength)基于原数组复制生成新数组,可自由指定新数组长度。若新长度大于原数组,超出部分自动填充默认值(如数字0、对象null),是实现数组动态扩容的标准方式。Arrays.binarySearch(sortedArr,key)前提是数组已排序!利用高效的二分查找算法快速定位目标值的索引,查找效率远高于普通线性遍历。若未找到元素,将返回一个负数表示插入点。int[]nums={5,2,9,1,5,6};//初始化数组

Arrays.sort(nums);//升序排序:[1,2,5,5,6,9]

System.out.println("数字9的索引:"+Arrays.binarySearch(nums,9));//输出结果:5String类概述不可变性(Immutable)字符串对象一旦被创建,其内容就不可修改。所有看似修改的操作(如拼接、截取),本质都是在堆内存中生成一个全新的字符串对象,原对象的数据始终保持不变。Strings="Hello";

s=s+"World";//创建新对象"HelloWorld"

//原"Hello"对象未改变,变量s指向新内存地址字符串常量池JVM的一种重要内存优化机制。它将字符串字面量集中存储在堆内存的特定区域,相同内容的字面量会被自动复用,从而避免了重复对象的创建,显著节省内存开销。Strings1="abc";

Strings2="abc";

System.out.println(s1==s2);//输出true,指向常量池同一对象核心认知:不可变性是String类最基础也是最重要的特性,决定了其线程安全等行为;而常量池则是Java为字符串高频操作提供的底层性能优化方案,理解这两点是掌握字符串操作与内存管理的关键。构造字符串对象空参构造器Strings=newString();创建一个不含任何字符的空字符串对象,适用于后续需要动态填充内容的场景。字符数组构造newString(charArray);将字符数组整体转换为字符串对象,是处理字符数据时最常用的初始化方式。截取数组构造newString(arr,1,3);灵活截取数组片段,从指定索引开始,提取固定长度的字符来生成新字符串。字节数组构造newString(byteArray);基于字节序列(如ASCII码)转换生成字符串,广泛应用于网络传输和文件IO操作。核心易错点:对象的内存差异直接赋值字面量会从常量池获取对象,而new关键字会在堆内存中开辟新空间。这意味着即使内容完全相同,两者也是不同的对象实例,在开发中极易引发逻辑错误。结论:比较内容必须使用equals()方法,而非==运算符。代码验证示例:Strings1="abc";Strings2=newString("abc");

System.out.println(s1==s2);//false(地址不同)

System.out.println(s1.equals(s2));//true(内容相同)💡提示:==比较的是对象地址,equals比较的是实际内容。String类的常用方法获取信息length()获取字符串的字符个数,返回int类型的长度值。charAt()传入索引值,返回该位置对应的单个字符。indexOf()查找子串首次出现位置,找不到返回-1。判断与比较equals()严格比较两个字符串的内容是否完全一致。equalsIgnoreCase()忽略大小写差异,仅比较字符的内容。contains()判断字符串中是否包含指定的字符序列。截取与拆分substring()从指定索引位置开始截取,生成新的子字符串对象。split()依据正则表达式分割字符串,返回字符串数组。转换与清理toLowerCase()将所有字符转换为小写形式,返回新字符串。toUpperCase()将所有字符转换为大写形式,返回新字符串。trim()去除首尾空白字符,常用于数据清洗。方法的定义与调用方法(Method)是一段具有特定功能的代码块,核心作用是对业务逻辑进行封装。通过将重复执行的操作定义为方法,不仅能让程序结构更清晰、层次更分明,还能实现代码的高效复用,减少冗余开发,是面向对象编程中实现功能模块化的基础核心。核心定义语法修饰符返回值类型方法名(参数列表){

//封装的业务逻辑代码块

[return返回值;]//有返回值时必须书写

}基础实现示例publicstaticintadd(inta,intb){

intsum=a+b;

returnsum;//返回两数之和

}

intresult=add(5,3);//调用方法得到结果8在这个经典的加法示例中,我们将“计算两个整数和”的功能封装为add方法。定义时明确了参数的类型和数量,调用时只需传入具体数值即可得到结果。这种模式让代码从“过程式的平铺直叙”转变为“模块化的功能调用”,不仅降低了维护成本,也让复杂的业务流程变得可拆解、可复用。参数传递-基本数据类型Java中参数传递的唯一方式:值传递当参数是基本数据类型时,方法接收的是变量值的副本。这就像复印了一份文件交给别人,别人在复印件上的修改,永远不会影响到你手中的原件。因此,在方法内部对参数的任何修改操作,都只会作用于这个临时副本,而绝对不会影响到方法外部原始变量的实际值。publicstaticvoidchangeValue(intx){ x=100;//操作的是副本,与原变量无关 } public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论