2017暑假 学习总结目录:
Time:7.17 ~ 7.23
Content
- ① 函数
- ② 递归函数的基本应用
- ③ 一维数组
- ④ 二维数组
- ⑤ 堆和栈的理解
- ⑥ StringBuffer的应用
- ⑦ 面向对象的简单了解
主要学习内容:
1. 函数
- 函数又被称为“方法”,按不同的功能可分为3种:主函数、普通函数和构造函数。在复习了函数的基本结构体之后,之前一直不太理解返回值的用法,现在我对于return有了更深入的认识。一个函数如果没有返回值类型,可以用void代替。在有void返回值的时候,return可以省略不写。如果一个函数没有返回类型(返回值为空),那么就不能通过system输出。一般来说程序都是主函数去调用普通函数,函数最大的好处就是提高了代码的重用性(DRY)。关于函数,当然还是通过实践来理解效果更好,在这里仅举一个简单的例子:
public class Test { public static void main(String[] args) { // 根据学号获取学生信息 getStudentInfo(1001); // 根据姓名和班级获取的学生信息 getStudentInfo("Tom", "23"); // 获取学生信息 年龄 姓名 String str = getStudentInfo(12, "Jerry"); System.out.println(str); } public static void getStudentInfo(int no) { System.out.println("根据学号获取的信息:" + no); } public static void getStudentInfo(String name, String bj) { System.out.println("根据姓名和班级获取的学生信息,姓名:" + name + ",班级:" + bj); } public static String getStudentInfo(int age, String name) { String str = "根据年龄和姓名获取个人信息"; return str; }}
还要注意一点,之前我也做过测试: 要严格按照参数列表顺序和个数传入参数。
2. 递归函数的基本应用
- 说到递归函数,我还是比较杂乱的,比较难理解的是递归函数的执行顺序。递归函数虽然可以减少代码量,但是要消耗大量资源,所以一般不建议使用。在执行递归函数或者编写一个递归函数的时候,最重要的就是考虑边界条件,因为传入变量一旦满足了边界条件,就会开始一次次地返回,我原来不理解的递归函数的执行顺序就是它遇到边界值返回的顺序。在使用debug调试了几遍之后已基本理解,在这里也列举一个例子:功能需求:求一个三位数,该三位数等与其每位数字的阶乘之和。
public class Test02 { public static int sum() { int i, x, y, z, a; for (i = 100; i <= 999; i++) { x = i / 100; // 获得百位数字 y = (i % 100) / 10; // 获得十位数字 z = i % 10; // 获得个位数字 a = sun(x) + sun(y) + sun(z); // 三位数中每一位数字的阶乘之和 if (i == a) { break; } } return i; } public static int sun(int n) { if (n < 0) { return -1; // 表示传入的数不合法 } else if (n == 0 || n == 1) { return 1; } else { return n * sun(n - 1); // 递归求n的阶乘 } } public static void main(String[] args) { System.out.println(sum()); }}
求阶乘或者求和,经常会用到递归函数。
3. 一维数组
- 对于上学期数组的学习,可以说不太好,因为书中的内容没有像之前的几章那样认真看,用起来自然比较陌生,所以我根据自己的掌握情况,从数组定义开始复习。定义数组有两种方法:动态初始化(元素个数)和静态初始化(具体元素)。数组的遍历方法也有两种,在这里不再提及,使用数组时,不要混淆数组的下标与数组的元素个数。举例分析:功能需求:获取数组中最大值、最小值、平均值,定义数组通过Scanner键盘输入依次赋值。
import java.util.Scanner;public class Test03 { public static void max_min_avg(int[] array) { int max = array[0]; // 假设数组中最大的元素是第一个元素 int min = array[0]; // 假设数组中最小的元素是第一个元素 int sum = 0; // 遍历数组更新极值 for (int i : array) { if (max < i) { max = i; } if (min > i) { min = i; } sum += i; } System.out.println("数组中的最大值是:" + max + "\t" + "最小值是:" + min + "\t" + "平均值是:" + sum / array.length); } public static void main(String[] args) { int[] array = new int[5]; Scanner scanner = new Scanner(System.in); for (int i = 1, j = 0; i <= 5; i++, j++) { System.out.println("请输入数组中第" + i + "个元素"); array[j] = scanner.nextInt(); } max_min_avg(array); }}
注意数组常常出现的两种异常:空指针异常和数组越界问题。
4. 二维数组
- 关于二维数组,它类似与一位数组,定义方式的格式相同。总之,数组部分是我需要“刻意练习”的部分,举一个基本的例子:遍历二维数组并求和
public class Test04 { public static void main(String[] args) { // 静态初始化 int[][] nums = { { 12, 13, 14, 10 }, { 100, 200 }, { 80, 30, 100 }, { 11, 12, 13, 14, 15 } }; query(nums); // 调用二维数组求和 System.out.println(getSum(nums)); } public static void query(int[][] ars) { // 遍历二维数组中有几个一维数组 for (int i = 0; i < ars.length; i++) { for (int j = 0; j < ars[i].length; j++) { System.out.print(ars[i][j] + "\t"); } System.out.println(); } } public static int getSum(int[][] arrs) { int sum = 0; for (int i = 0; i < arrs.length; i++) { for (int j = 0; j < arrs[i].length; j++) { // 依次进行相加求和 sum += arrs[i][j]; } } return sum; }}
5. 堆和栈的理解
堆和栈娄老师上学期多次讲过,但是比较零碎,我就跟着视频总体复习了一遍,总结如下:
-
堆 栈 简述 一种先进后出的线性表 一类特殊数据结构的统称 存储 局部变量 new出来的东西、数组 初始化 栈中变量(必须先初始化) 有初始值(默认值) 生存周期 用完立刻销毁 如果引用不存在,则被jvm回收 响应速度 较快 较慢
6. StringBuffer的应用
- 关于StringBuffer,上学期接触也不少,主要用于处理字符串信息,与String不同的是它处理的是可变的字符串信息,并且效率更高。使用toString方法就能把StringBuffer对象转成String了,示例如下:
public class Test05 { public static void main(String[] args) { // 创建对象 StringBuffer bf = new StringBuffer(); bf.append("abc"); // 添加内容 System.out.println(bf); bf.append("dfg"); System.out.println(bf); // StringBuffer转String System.out.println(bf.toString()); // String转StringBuffer String name = "abc"; StringBuffer cf = new StringBuffer(name); }}
注意在初始化字符串的时候,StringBuffer与String的方式不同。
对于StringBuffer类,它的一些方法比String简便,比如reverse方法:public static void main(String[] args) { String str="ABCDEFG"; //String testString(str); System.out.println(); //StringBuffer System.out.println("StringBuffer方法倒序输出字符串"); StringBuffer sb=new StringBuffer("ABCDEFG"); System.out.println(sb.reverse()); } public static void testString(String str){ System.out.println("String方法倒序输出字符串"); for(int i=str.length()-1;i>=0;i--){ System.out.print(str.charAt(i)); } }
所以在实际使用时,如果经常需要对一个字符串进行修改,那么使用StringBuffer会更加适合一些。
7. 面向对象的简单了解
- 这部分内容主要涉及到继承、封装、多态原则,对象的创建与调用过程,构造函数的使用等。这部分内容也容易混淆,第三周仅作简单了解,全面的复习内容会在下周总结。
本周感想:
本周我的放松心态有些加重,从博客的情况就能看出来。总的来说,现在只能保证每天基本内容的学习,本来想要对数组“刻意练习”一下,可是这个计划被我的悠闲打乱了,因此只能放到后续的复习计划中。现在想想,复习的内容已经过半,计划复习时间是一个月。再加把劲,把最后这点内容梳理清楚了,可能下学期就会相对轻松一些。下个月我会对一些零碎的内容和之前未解决的、不够深入的问题继续学习。当然,也不能只看视频,也要把书中的重点内容过一遍。 感觉总结的过程有些枯燥,我会想办法将这个过程转化为类似 中的“游戏化”的过程,适时提起自己的兴趣和动力。现在最缺少的还是一份积极主动学习的动力,后续改进后可能会对本篇博客内容进行适当添加。 略有抱怨的一点:回家之后CSDN的博客访问不了(•̀ - •́)!之前还以为是网络错误或者浏览器的原因,现在看来应该是新疆这边的移动网络禁止了CSDN的访问,不过博客园的资源对于我来说已经足够了,在这里再次感谢一下博客园平台,可以让我在无聊时通过一些博客开阔自己的眼界。