201621123063《java程序设计》第三周学习总结

1. 本周学习总结

2. 书面作业

1.以面向对象方式改造数据结构作业'有理数'(重点)

1.1 截图你主要代码(需要在程序中出现你的学号和姓名)并粘贴程序的git地址。

git地址:https://gitee.com/Yelz/java201621123063.git

Rational类:

测试类:

测试数据:

1.2 对比你的代码与历程的代码,说明面向对象编程与面向过程编程有何区别?
面向过程是一种直接的编程方法,它是按照编程语言的思路考虑问题。尤其是想C语言这种过程式语言,它就是通过顺序执行一组语句来实现一个功能,这些语句的执行过程就是整个程序。不同的语言解决同一个问题的过程是不一样的。

面向对象是一种抽象度更高的编程方法。它把眼光集中在了要解决问题本身而不是语言上。它的目标是使模块的抽象度更高,可复用性更好。面向对象的目的就是可复用。

2.构造函数与初始化块

2.1 结合PTA 5(构造函数与toString)说明构造函数有什么用?其函数格式有何特征?
构造函数用来初始实例化对象,以PTA5为例,构造函数格式如下

public Person(){
......
}

2.2 如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?
一个类不写构造函数也有默认的构造函数,有带参的构造函数后不带参数的默认构造函数就失效了
2.3 查看String类的源代码,找出3个看得懂的String类的构造函数,并使用自己的话描述这3个构造函数的区别。
①String(); 构造一个空字符串对象 没有传入参数
②String(byte[] bytes); 通过byte数组构造字符串对象 重载构造函数

③String(char[] value); 通过char数组构造字符串对象 重载构造函数

2.4 结合PTA(构造函数与初始化块)说明初始化块与构造函数的异同。并说明,初始化块与构造函数谁先执行?初始化块与静态初始化块有何不同,谁先执行?
①同:都是对对象进行初始化 异:构造函数具有针对性 是给与之对应的对象进行初始化。而初始化块是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块,只要对象一建立,就会调用这个代码块。
②初始化块与构造函数,初始化块先执行
③静态初始化块执行优先级高于非静态的初始化块,它会在对象装载到系统的时候执行一次,执行完成便销毁,它仅能初始化类变量

3.代码分析:Math类

3.1 使用java.lang.Math类的方法时,为什么不需要new出一个Math对象,然后调用该对象上相应的方法?
因为java.lang.Math类的方法以及属性都是static修饰的静态的,所以可以通过类型Math.直接引用,不需要new实例化构造一个对象再调用Math类中的方法
3.2 如果new Math()会产生什么错误?尝试阅读Math类源代码,分析原因。
如下为Math类源代码中的构造函数,可以看到注释,Math类不能被任何类继承

如果new Math()会产生如下错误:构造函数是不可见的,构造函数用private修饰保护

3.3 进一步:你觉得什么样的对象需要new出来才能用,调用什么方法时不必创建相应对象就可以使用?(重点检查)
调用某个对象的任何非静态方法时,这个对象必须首先需要被创建(即new)
静态方法不必创建相应对象即可使用。被引用的对象需要new才能用,调用某个对象的任何非静态方法时,这个对象必须首先需要被创建(即new),静态方法不必创建相应对象即可使用

4. 重载Overload

4.1 什么是重载?什么是构造函数重载?怎么才能区分两个重载的方法?
是指多个方法用同一个方法名,但是传入的参数不同,例如求两个是当中的最大值就有函数重载,可以通过闯入参数的不同来区别两个重载函数,通过返回值是不能区别开来的
4.2 在java.lang.Math类中举出1个方法重载的例子?

public static int multiplyExact(int x, int y) {
        long r = (long)x * (long)y;
        if ((int)r != r) {
            throw new ArithmeticException("integer overflow");
        }
        return (int)r;
    }
    public static long multiplyExact(long x, long y) {
        long r = x * y;
        long ax = Math.abs(x);
        long ay = Math.abs(y);
        if (((ax | ay) >>> 31 != 0)) {
            // Some bits greater than 2^31 that might cause overflow
            // Check the result using the divide operator
            // and check for the special case of Long.MIN_VALUE * -1
           if (((y != 0) && (r / y != x)) ||
               (x == Long.MIN_VALUE && y == -1)) {
                throw new ArithmeticException("long overflow");
            }
        }
        return r;
    }

5. 代码阅读: final

final修饰的变量不能改变,为什么如下代码却可正常运行?
final int[] NUMBS= {1,2,3,4,5}; NUMBS[2] = 1;

final修饰引用类型变量,变量的引用不能被修改;如上代码中是引用了数组对象,对象没有被修改,但是对象指向的属性值是可以被修改的
所以是可以正常运行的

6. Java8中的时间日期类:编写函数public static boolean isMondayToFriday()

功能:判断今天如果是周一到周五,返回true,返回false。main函数中调用该函数,如果为true则输出“工作日+姓名学号”,否则输出"休息+姓名学号"。

截图:关键代码。
提示:使用LocalDateTime, DayOfWeek类

7. 封装

7.1 结合PTA(形状),请用自己的话简单总结一下面向对象中封装是什么意思?有何好处?
封装就是定义一个类,然后给该类的属性(成员变量)和方法加上访问控制修饰词(public,private, protected,默认包访问权限),使得该类的属性和方法对于类外部来说,想可见的可见,不想可见的隐藏。Public(共有)的定义任何人都可使用.private(私有)意味着除你自己,类型创建者及那个类型的内部函数成员可以访问外其他任何人使用都会产生错误。
封装的好处:封装是人们对现实世界中解决问题时,为了进行简化问题,对研究的对象所采用的一种方法,一种信息屏蔽技术。

7.2 和封装有关的关键字有哪些?
public(共有的) private(私有的)

8. 结对编程实践(未完成,0分)

队友:陈锦霞
本次结对编程实践完成了实验题一二两题。和第一次编程实践一样我们两个依旧是各自说出自己的思路,然后先由其中一人先打代码,没有准确的规定时间。
然后再换另一个人进行打代码。结对编程的好处就是遇到问题可以一起解决,很多很细节的错误往往自己打的时候不会发现,但通过结对编程很多问题可以很快的完成,缩短了在代码细节错误上所消耗的时间。
提高了效率,并且每个人的思路不同,进行结对编程也能让我了解到更多的解法,和思路。

3. 码云及PTA

3.1. 码云代码提交记录##

3.2 截图PTA题集完成情况图##


3.3 统计本周完成的代码量##

周次 行数 新增行数 文件数 新增文件数
1 226 226 45 45
2 377 377 7 7
3 712 281 42 9
posted @ 2017-09-30 23:25  Yelz  阅读(238)  评论(3编辑  收藏  举报