*黑海岸*Java可视化从入门到精通 第四篇
一.循环结构一、循环的概念1. 概念通过某个条件重复并且有规律的执行一段程序代码。2. 循环的组成循环变量的初始化、循环条件、循环变量改变(递增、递减)、循环体(重复执行的代码)。二、循环的分类1. while循环【重点】(1) 语法循环变量的定义while(循环条件/布尔表达式){// 循环体// (循环变量的改变)}(2) 执行的原理先判断循环条件是否满足(布尔表达式的结果是否true),满足(true),则执行循环体同时循环变量改变接着继续判断循环条件是否满足满足-继续执行循环体同时循环变量改变直到循环条件不满足(布尔表达式的结果为false)结束循环继续执行循环后面的内容。(3) 循环的特点先判断再执行执行的次数0~n次。(4) 注意循环过程中如果循环变量没有给予任何改变可能会出现死循环。循环条件如果直接给的 true,则循环一直进行也是死循环的现象。2. do...while 循环(1) 语法do{//循环体// 循环变量改变}while(循环条件/布尔表达式); // 分号不能省略(2) 执行的原理先执行循环体同时循环变量进行改变再判断循环条件是否满足满足继续执行循环体同时循环变量改变再判断循环条件直到循环条件不满足(结果为 false为止)结束循环继续执行循环后面的内容。(3) 执行特点先执行再判断执行次数1~n次。3. for 循环【重点】(1) 语法for(①循环变量的初始化; ②循环条件/布尔表达式 ; ③循环变量的改变){// 循环体④}(2) 循环执行的原理先进行循环变量的初始化①,然后判断循环条件②,条件成立(结果为true),执行循环体④,接着执行循环变量的改变③再次判断循环条件②条件成立继续执行循环体④再次改变循环变量③直到循环条件不成立(结果为false)结束循环继续循环之后的内容。(3) 特点先判断再执行执行的次数0~n次。(4) 注意a. for后面的()中循环变量的改变可以写在循环体中:for(循环变量的初始化;循环条件; ){// 循环体// 循环变量的改变 ------------》不建议}b. for()中的循环变量的定义及初始化可以写在循环的前面但是定义循环的前面的循环变量作用范围扩大开发时通常将循环变量的定义及初始化定义在()中这种定义变量只能在for循环结构中使用循环结束循环变量也被收回减小空间从而提高空间的利用率。总结(1) 如果循环次数明确时建议使用 for(2) 如果循环次数不明确时建议使用 while 或是 do..while三、循环的控制语句【重点】1. break终止、跳出循环结构。2. continue结束本次循环从而进入下一次循环。面试题目写出 break 和 continue 的区别。解析break不仅可以用在循环中还可以用在 switch...case结构continue只能用在循环中。break用在循环中代表结束、跳出、终止循环结构continue结束本次循环从而的进入下一次循环。四、循环的嵌套1. 概念在一个循环结构中又定义了一个完整的循环结构。2. 双层循环的循环次数外层循环次数*内层循环的次数3. break 和 continue用在循环嵌套中break : 终止、跳出本层的循环continue: 结束本层本次循环从而进入下一次循环。4. 双层循环可以用于打印输出图形通常用 外层循环控制图形的行数内层循环控制图形的列数5. 利用标号控制循环二.函数存在的问题1. 代码冗余代码量太大2. 维护性差复制容易修改难如何解决此问题1. 对反复的代码只写一次并对它起个名字2. 想使用次功能代码时只需要通过名字执行对应的功能即可。二、函数的概念【理解】1. 概念执行特定功能代码组成的一个整体可以通过名字反复使用。2. 使用函数流程(1) 定义函数a. 函数的声明 约定函数实现功能 --》名字b. 函数的实现实现对应的函数约定的功能。--》将特点功能代码给出// 要求用循环实现每一行之间用 30个 号隔开System.out.println(好好学习);for(int i1;i30;i){System.out.print();}System.out.println();System.out.println(天天向上);for(int i1;i30;i){System.out.print();}System.out.println();System.out.println(good good study);for(int i1;i30;i){System.out.print();}System.out.println();System.out.println(day day up);(2) 函数的调用通过函数名让函数执行对应的功能代码。3. 函数的定义位置定义在类以内与main函数并列的位置。4. 函数的定义【开发应用重点】(1) 语法public static 返回值类型 函数名(数据类型 变量名,数据类型 变量2){// 函数的功能代码-函数的实现(函数体)}(2) 函数的声明public static 返回值类型 函数名(数据类型 变量名, 数据类型 变量名2)函数的返回值类型、函数名、形参列表称为函数的三要素。a. 函数名 望文生义遵循驼峰命名法(第一个单词的首字母小写其余单词首字母大写)b. 参数调用者调用函数的时传递的数据成为参数。I. 形式参数 在函数声明的时候 ()中定义的参数称为形式参数简称形参。II. 使用形式参数它相当于 函数的内容的局部变量在函数内部可以直接通过参数名直接使用(只能在当前函数内部使用)III. 形式参数的定义 函数声明 (数据类型 参数名,数据类型 参数名) -》 可以定义n个-》 形参列表c. 返回值类型 约定了函数返回给调用者的结果类型(1) 返回值结果为 void ,则代表函数没有结果返回但是可以 return ; 结束当前函数的调用。(2) 返回值类型为 8种基本数据或是对象类型代表函数必须有 return XXX; 语句return 返回的结果必须和约定的返回值类型结果一致。(3) return 的作用a. 将函数的结果 返回给调用者b. 结束当前函数 (return 语句后面不允许在定义任何的语句)(4) 注意事项如果 return 语句定义在分支结构中必须保证每一个分支都有return 语句。(3) 函数的实现{}三、函数的调用1. 函数的调用函数名(); // 可以被调用 n 次2. 带参数的调用 函数名(数值,数值2)// 1不可以public class Test{// 2可以定义函数public static void main(String[] args){System.out.println(这是Main函数...);// 3不可以}// 4可以定义函数}// 5不可以(1) 调用者传递的数值被称为实际参数简称为实参。(2) 实参的作用实参给形参赋值实参必须和形参 的个数、顺序、类型一致。3. 带有返回值的函数调用(1) 数据类型 变量 函数名(实参); // 数据类型 需要和返回值的数据类型一致(2) 带有返回值的函数调用之后对结果可以不进行任何处理 // 应用场景几乎没有(3) 带有返回值的函数调用之后直接参与打印或是运算四、函数的作用1. 减少代码的冗余2. 提高代码的可维护性3. 提高代码的重用性4. 利于分工协同合作五、函数的运行机制【理解】1. 函数的嵌套调用被调函数的内部又调用了其他的函数。2. 函数的执行原理程序执行过程中遇到函数的调用则程序跳到被调用的函数内部执行被调用函数执行完之后如果有返回值带着返回值返回到调用位置没有返回值,直接返回到被调用的位置,程序继续往下执行。(六)、递归调用【理解】1. 概念一个函数的内部调用了自身函数这种现象称为递归调用。2. 实际开发中需要给递归设置合理的出口避免无穷递归。3. 例子三.数组数组一、数组1. 概念 可以通同时存储多个 相同类型的数据并且可以对其中的多个数据统一操作。2. 使用数组的流程(1) 声明指定数组的存储数据类型同时指定数组名数据类型[] 数组名; // int[] a; 建议写法// int []a; int a[];(2) 分配空间指定数组的 长度数组名 new 数据类型[长度];(3) 使用数组【基础重点】a. 数组中存储的数组被称为数组元素。b. 对数组的操作分为存元素 和 取元素c. 对数组的存取元素通过数组名 和下标进行操作存元素 数组名[下标] 值;取元素 数组名[下标]d. 对数组的每一个空间进行编号这个编号被称为下标。数组的下标范围 0 ~ 数组长度-1e. 如果操作数组时指定的数组下标不在 0~数组长度-1的范围内编译通过运行报错错误信息为java.lang.ArrayIndexOutOfBoundsException(数组的下标越界)f. 数组的遍历对数组中的元素进行一一访问的过程。// 用循环的变量 控制 数组的下标for(int i0;i 数组的长度i){// 通过 a[i] 操作数组的每一个元素}获取数组的长度 数组名.length3. 数组具有默认值值默认值情况如下【掌握】(1) 整数 0(2) 小数0.0(3) 布尔false(4) 字符空字符 (\u0000)(5) 对象/引用null4. 数组的其他定义方式【多练】(1) 声明的同时分配空间数据类型[] 数组名 new 数据类型[长度];(2) 显示初始化数据类型[] 数组名 new 数据类型[]{值1,值2,值3};注意[]中不能再指定数组的长度长度有{}中值个数决定。(3) 显示初始化数据类型[] 数组名 {值1, 值2, 值3};注意声明和初始化必须一起完成同时数组的长度由{}中值个数决定。int[] a ;a {1,7,4}; //error错误二、数组的内存【难点理解】1. 数组在内存中空间是连续的。2. 数组名存储的是 数组在 内存中的首地址。3. 计算机中的寻址方式首地址 下标 * 每一个存储空间的字节数。---》(数组名[下标])4. 数组下标从 0开始是为了提高 寻址效率。5. 数组类型的变量相互赋值传递的是数组在内存中首地址。基本数据类型变量相互赋值传递的是数值。三、数组的扩容1. 扩容思想【理解】(1) 先申请一个更大空间的新数组通常新数组长度为原数组长度的2倍(2) 将原数组中的元素进行一一复制到新数组中(3) 新地址 覆盖 旧地址2. 数组扩容实现的方式(1) 第一种方式int[] a new int[]{1,7,4,3};// 1. 申请新数组 长度为原有数组的2倍int[] b new int[a.length*2];// 2. 将原有数组中内容进行一一拷贝到新数组中for(int i0;ia.length;i){b[i] a[i];}// 3. 新的地址覆盖旧的地址a b;~~~(2) 利用 System.arraycopy(a,0,b,0,a.length); // 完成 数组复制参数说明第一个参数原数组名第二个参数原数组拷贝的起始下标第三个参数新数组名~~~java 1第四个参数新数组的存储起始下标第五个参数拷贝的个数/长度(3) 利用 java.util.Arrays.copyOf(原数组名,新数组的长度) // 完成新数组的定义数组的复制参数说明第一个参数扩容的数组名第二个参数指定新数组的长度四、可变长参数【阅读源码和API时经常遇到】1. 可变长参数函数可以接受个数不固定的实参jdk5.0 提出的概念。2. 注意参数的个数由调用者调用数给定 个数确定可变长参数可以接受不等数量的相同类型的数据。3. 语法 public static 返回值类型 函数名(数据类型... 变量名){}4. 使用可变长参数会自动生成对应类型数组所以在函数中直接将 可变长参数当做数组应用即可。5. 语法规定一个函数中最多只能定义一个可变长参数并且可变长参数必须定义在形参最后一个位置。6. 可变长参数可以提高代码的灵活度。五、数组的排序【面试重点】1. 冒泡排序法将相邻的两个元素进行一一比较元素大逐步往后移。 (从小到大排序)六、二维数组【了解即可】1. 语法(1) 声明数据类型 [] [] 数组名;(2) 分配空间数组名 new 数据类型[行数] [列数]; // 行 又称为高维 列低维2. 二维数组的使用(1) 通过行和列对二位数组进行访问数组名[行标] [列标]注意行标和列表都是从 0 开始例如 a[0] [3] // 第0行第3列的元素(2) 二维数组也具有默认值同一维数组(3) 获取二维数组的行数 数组名.length列数数组名[行标].length3. 二维数组的其他定义方式(1) 声明的同时并分配空间数据类型[][] [] [] 数组名 new 数据类型[行数] [列数];(2) 显示初始化数据类型[] [] 数组名 new 数据类型[] []{{值1,值2},{值3,值4},{值5,值6}};注意后面 {} 中 {}的个数决定行数所以[] []中个不能再制定行数和列数。(3) 显示初始化数据类型[] [] 数组名 {{值1,值2},{值3,值4}};注意声明和初始化必须一起完成。4. 不规则的二维数组(1) 概念每一行的列数不相同(2) 不规则的二维数组的定义方式a. 数据类型[] [] 数组名 new 数据类型[行数] []数组名[0] new 数据类型[长度];数组名[1] new 数据类型[长度];....注意二维数组定义可以只指定行数/高维但是不能只指定列数/低维b. 数据类型[] [] 数组名 {{值1},{值1,值2,值3},{值1,值2}}下面是上期代码答案***下面是黑海岸技术部门入职练习1、编程读入一个整数表示一个人的年龄。如果小于6岁则输出“儿童”6岁到13 岁输出“少 儿”14岁到17岁输出“青少年”18岁到35岁输出“青年”36岁 到50岁输出“中年”50岁以上输出“中老年”。2、编程读入一个表示年份的整数判断这一年是否是闰年。如何判断一个年份 是否是 闰年如果这个年份能够被4 整除且不能被100 整除则这一年是闰年。例如1996 年是闰年而相应的1993 年就不是闰年。如果这个年份能够被100 整除则这个数必须要能被400 整除才是闰年。例如2000 年是闰年1900 年不是闰年。