博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2017暑假 第三周 学习总结(复习)
阅读量:5064 次
发布时间:2019-06-12

本文共 6456 字,大约阅读时间需要 21 分钟。


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的访问,不过博客园的资源对于我来说已经足够了,在这里再次感谢一下博客园平台,可以让我在无聊时通过一些博客开阔自己的眼界。

参考资料:

转载于:https://www.cnblogs.com/super925/p/7242200.html

你可能感兴趣的文章
延迟环境变量扩展(bat)
查看>>
Git的使用--打tag
查看>>
F# 编程 借助 F# 构建 MVVM 应用程序
查看>>
ACFUN切换代码自用。。。
查看>>
网卡流量检测.py
查看>>
【转】Android的权限permission
查看>>
ajax
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
线程同步机制初识 【转载】
查看>>
Oracle 游标使用全解
查看>>
Spring mvc annotation and xml example
查看>>
关于报错The specified child already has a parent的解决办法
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
银行排队问题(详解队列)
查看>>
input输入提示历史记录
查看>>
序列化和反序列化(1)---[Serializable]
查看>>
linux命令**50
查看>>