201621123053《Java程序设计》第三周学习笔记文章
1. 本周学习总结
- java是面向对象编程。
- 对象和类的区分。
- pubilc和pivate的区别。
- 构造函数this。
2. 书面作业
1.以面向对象方式改造数据结构作业'有理数'(重点)
注意:属性必须修饰为为private
1.1 截图你主要代码(需要在程序中出现你的学号和姓名)并粘贴程序的git地址。
https://gitee.com/milan_kaka/java201621123053/commit/684baab5fe61fcc131bf0c25d671ea106c01a67d#diff-5
1.2 对比你的代码与历程的代码,说明面向对象编程与面向过程编程有何区别?
- 面向对象的编程没有结构体,只需定义一个Rational类即可。
- 没有引用类型。
- 面向过程的编程需要进行一步步分析,知晓每一步应该做什么,然后再进行编程。
- 面向对象的编程只需要定义一个类并知道它的使用方法即可,不需要理解这一步是如何实现的。
2. 构造函数与初始化块
2.1 结合PTA 5(构造函数与toString)说明构造函数有什么用?其函数格式有何特征?
- 构造函数的作用是为类中的具体对象赋初始值。
- 构造函数名必须和类名完全相同,它没有返回值,也不可用void修饰。必须通过运算符new来调用。
2.2 如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?
- 如果一个类不写构造函数,它是有构造函数的。
- 在java编译器中,它会默认提供一个不带参数的构造函数。
2.3 查看String类的源代码,找出3个看得懂的String类的构造函数,并使用自己的话描述这3个构造函数的区别。
-
public String(String original) { this.value = original.value; this.hash = original.hash; }
-
public String(char value[]) { this.value = Arrays.copyOf(value, value.length); }
-
public String() { this.value = "".value; }
-
区别:第三个是无参构造函数,第一个第二个是有参构造函数。
2.4 结合PTA(构造函数与初始化块)说明初始化块与构造函数的异同。并说明,初始化块与构造函数谁先执行?初始化块与静态初始化块有何不同,谁先执行?
- 初始化块先执行,构造函数后执行。
- 初始化块与静态初始化块的区别是,静态初始化块只能引用static成员。
- 静态初始化块先执行,并且只执行一次,就是程序首次加载时。初始化块后执行,切每调用一次则执行一次。
3.代码分析:Math类
3.1 使用java.lang.Math类的方法时,为什么不需要new出一个Math对象,然后调用该对象上相应的方法?
- 查阅java的AIP文档,显示
public final class Math extends Object
,即Math并非一个静态类型。 - 继续查阅,发现Math的abs方法是静态的,即
public static double abs(double a)
。根据定义,如果一个方法是静态的,则可以在整个类中直接调用。即用 Math.方法 的格式调用。所以不需要new一个新的Math对象。
3.2 如果new Math()会产生什么错误?尝试阅读Math类源代码,分析原因。
- Eclipse显示错误,无法运行。
- 原因是Math的方法是静态的,无法使用new。
3.3 进一步:你觉得什么样的对象需要new出来才能用,调用什么方法时不必创建相应对象就可以使用?(重点检查)
- 当这个对象所属的类是一个非静态类,且方法都是非静态时,需要new出来才能用。比如
Scanner n =new Scanner (System.in);
int[] num=new int[10]
。 - 可以将类理解为机器,生产产品(对象)。当我们需要产品时,需要命令机器生产产品,即在类中new一个对象,并为其分配空间。
4. 重载Overload
4.1 什么是重载?什么是构造函数重载?怎么才能区分两个重载的方法?
- 重载就是函数或者方法的名称相同,但是所包含的参数不同。
- 构造函数重载就是构造函数的名字相同,但是参数不同。
- 利用参数的差异可以区分两个不同的重载。
4.2 在java.lang.Math类中举出1个方法重载的例子?
Math.abs(double a)
返回double值的绝对值。Math.abs(float a)
返回float值的绝对值。Math.abs(int a)
返回int值的绝对值。
5. 代码阅读: final
final修饰的变量不能改变,为什么如下代码却可正常运行?
final int[] NUMBS= {1,2,3,4,5}; NUMBS[2] = 1;
- 查阅百度得知,
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
- 在上述代码中,final修饰的是NUMBS这个数组,它是不可变的。
- 而NUMBS[2]是一个具体的对象,所以是可变的。
6. Java8中的时间日期类:编写函数public static boolean isMondayToFriday()
功能:判断今天如果是周一到周五,返回true,返回false。main函数中调用该函数,如果为true则输出“工作日+姓名学号”,否则输出"休息+姓名学号"。
截图:关键代码。
提示:使用LocalDateTime, DayOfWeek类
参考资料:
JAVA 8:健壮、易用的时间-日期API - ImportNew.pdf
Java8DateTimeTest.java
7. 封装
7.1 结合PTA(形状),请用自己的话简单总结一下面向对象中封装是什么意思?有何好处?
- 封装的意思是,通过将方法和类进行处理,控制用户对类的修改和访问数据的程度。对数据的访问只能通过定义的接口来进行。
- 适当的封装可以让代码更加易懂,同时增强了安全性。
- 摘自百度百科
对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的
7.2 和封装有关的关键字有哪些?
- 和封装有关的关键字有private,public以及暂时没用过的protected。
8. 结对编程实践(未完成,0分)
找一个水平相近的同学完成1-2题实验题。开始编程前,可先对内容进行讨论。
写出体验报告,包括以下内容:1.对方姓名。2.所完成的题目。3.感想。4.照片(上次很多同学并未贴照片,请贴上)
- 李铎。
- 博客作业第六题编写函数public static boolean isMondayToFriday()。
- 自己一个人思考总是会有疏漏。两个人一起思考出错的几率就大大降低了。
3. 码云及PTA
3.1. 码云代码提交记录
• 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
需要有两张图(1. 排名图。2.PTA提交列表图)
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中,可使用最新版的代码统计工具的-history参数,详细用法见项目wiki地址。表格如下所示:
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 200 | 200 | 3 | 3 |
2 | 308 | 108 | 7 | 4 |
3 | 571 | 263 | 16 | 9 |