2017暑假 第三周 学习总结(复习)


2017暑假 学习总结目录:   1   2   3   4


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. 面向对象的简单了解

  • 这部分内容主要涉及到继承、封装、多态原则,对象的创建与调用过程,构造函数的使用等。这部分内容也容易混淆,第三周仅作简单了解,全面的复习内容会在下周总结。

【Return Content】


本周感想:


  本周我的放松心态有些加重,从博客的情况就能看出来。总的来说,现在只能保证每天基本内容的学习,本来想要对数组“刻意练习”一下,可是这个计划被我的悠闲打乱了,因此只能放到后续的复习计划中。现在想想,复习的内容已经过半,计划复习时间是一个月。再加把劲,把最后这点内容梳理清楚了,可能下学期就会相对轻松一些。下个月我会对一些零碎的内容和之前未解决的、不够深入的问题继续学习。当然,也不能只看视频,也要把书中的重点内容过一遍。
  感觉总结的过程有些枯燥,我会想办法将这个过程转化为类似 第二周总结博客中的“游戏化”的过程,适时提起自己的兴趣和动力。现在最缺少的还是一份积极主动学习的动力,后续改进后可能会对本篇博客内容进行适当添加。
  略有抱怨的一点:回家之后CSDN的博客访问不了(•̀ - •́)!之前还以为是网络错误或者浏览器的原因,现在看来应该是新疆这边的移动网络禁止了CSDN的访问,不过博客园的资源对于我来说已经足够了,在这里再次感谢一下博客园平台,可以让我在无聊时通过一些博客开阔自己的眼界。

参考资料:

【Return Content】

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值