Week03-面向对象入门
1.本周学习总结
1.1写出你认为本周学习中比较重要的知识点关键词,如类、对象、封装等
关键词:类,对象,封装,继承,this关键字,final关键字,static关键字,构造函数。
1.2 用思维导图或者Onenote或其他工具将这些关键词组织起来。
2.书面作业
1.以面向对象方式改造数据结构作业'有理数'(重点)
注意:属性必须修饰为为private
1.1 截图你主要代码(需要在程序中出现你的学号和姓名)并粘贴程序的git地址。
1.2 对比你的代码与历程的代码,说明面向对象编程与面向过程编程有何区别?
面向对象编程需要初始化,要将类进行封装,里面的属性、方法就不会被看见,而用户可以直接使用public来实现某一方法的调用,是整体的感觉。而面向过程编程更注重的是解决一个问题,抛出问题,使用函数去直接实现,而不用包装啊之类的,函数也是可见的,是零零散散的。就像开车的例子,面先对象就是你只需要知道踩油门会加速就行,而面向过程的话就是你要了解为什么踩油门会加速,里面的原理构造等等。可见生活中面向对象更为人所接受。
2.构造函数与初始化块
2.1 结合PTA 5(构造函数与toString)说明构造函数有什么用?其函数格式有何特征?
构造函数的作用:初始化对象的属性,在对象类型定义后能给他分配空间来使用。
class Demo{
Demo(){
System.out.println("构造的例子");
}
}
特征:构造函数的名称和类的名是一样的,可以是有参构造函数和无参(即默认)构造函数。
2.2 如果一个类不写构造函数,它有构造函数吗?如果一个类中只有带参的构造函数,它有没有不带参数的默认构造函数?
类中不写构造函数的话,会自动产生一个无参构造函数。
一个类中只有带参的构造函数,可以有不带参数的默认构造函数,即同名但不同参数。
2.3 查看String
类的源代码,找出3个看得懂的String类的构造函数,并使用自己的话描述这3个构造函数的区别。
图1
初始化一个新创建的的对象,表示的是一个空字符串且会一直在内存中。
图2
使用StringBuffer这个对象实现初始化,StringBuffer是线程安全的。用synchronized关键字修饰。
修饰类时其作用的范围是synchronized后面括号括起来的部分,作用主对象是这个类的所有对象。
图3
数组对象初始化,以便它表示当前包含在字符数组参数中的字符序列。当字符数组的内容被复制,字符数组的后续修改不会影响新创建的字符串。
第一个构造函数是没有参数的。其他两个都是有参数的。第二个构造函数是StringBuffer要考虑多线程问题,需要用关键字synchronized来给StringBuffer加锁。
2.4结合PTA(构造函数与初始化块)说明初始化块与构造函数的异同。并说明,初始化块与构造函数谁先执行?初始化块与静态初始化块有何不同,谁先执行?
构造函数和初始化块都是对对象进行初始化,但是,构造函数时要和类的名一样,初始化块就不需要。写个代码确认一下:
public class Main0 {
public static void main(String[] args) {
new Person();
}
}
class Person{
static{
System.out.println("这是静态初始化块");
}
{
System.out.printf("这是初始化块\n");
}
public Person(){
System.out.println("这是无参构造函数");
}
}
结果为
PTA题目图:
从图中可以看出,静态初始化块是先执行的,然后是初始化块,最后是构造函数(这里是无参构造函数)。
3.代码分析:Math类
3.1 使用java.lang.Math
类的方法时,为什么不需要new出一个Math对象,然后调用该对象上相应的方法?
3.2 如果new Math()会产生什么错误?尝试阅读Math类源代码,分析原因。
3.3 进一步:你觉得什么样的对象需要new出来才能用,调用什么方法时不必创建相应对象就可以使用?(重点检查)
通过下图(只截了一部分)我们知道Math类的所有变量和方法都是静态的,一般来讲,需要new来创建的对象,都有他自己的内部状态。对于static修饰的是不需要new来创建对象的。
通过看源代码,我们会发现,Math类是无法建立对象的。math类有构造函数,不过它的构造函数是私有的,也就无法创建math类。
我觉得如果这个对象内部的方法都是非static的时候,就需要new出来才可以使用。当这个对象要被调用static的方法时,那么这个时候,该对象不必创建相应对象就可以使用。
4. 重载Overload
4.1 什么是重载?什么是构造函数重载?怎么才能区分两个重载的方法?
4.2 在java.lang.Math
类中举出1个方法重载的例子?
重载就是对于一个类中,多个方法可以是相同的名字,但是当名字相同时,参数要求不同。比如一个人学会一门外语,他可以报培训班,也可以自学等等许多其他方法去学会。构造函数重载是函数名和类名一样,但参数类型不同,其实作用就是初始化对象。如果要区分两个不同的重载方法,可以通过参数来区别。
如图,类型都是double型,即方法名相同,但是参数列表不同。
5. 代码阅读: final
final修饰的变量不能改变,为什么如下代码却可正常运行?
final int[] NUMBS= {1,2,3,4,5}; NUMBS[2] = 1;
我们都知道,final这个管家你在用来修饰某一个变量的时候,对于引用变量来说,该引用变量不会改变,但是该引用变量所指对象里面的内容是可以改变的。也就是上面代码可以正运行的原因。如果final修饰基本数据类型的变量时,那就不一样了,这个基本数据类型在初始化后就不会改变。而对于引用型变量,其在初始化之后这个变量是不能再指向其他对象。
6. Java8中的时间日期类:编写函数public static boolean isMondayToFriday()
功能:判断今天如果是周一到周五,返回true,返回false。main函数中调用该函数,如果为true则输出“工作日+姓名学号”,否则输出"休息+姓名学号"。
截图:关键代码。
提示:使用LocalDateTime, DayOfWeek类
判断条件(开始不会,百度解决):
运行:
7.封装
7.1 结合PTA(形状),请用自己的话简单总结一下面向对象中封装是什么意思?有何好处?
7.2 和封装有关的关键字有哪些?
对象封装就是将内部的属性打包起来,用公共的方法去访问私有属性,可以做到隐藏内部的实现细节。优点:1.可以让公共访问变的方便,不需要了解内部是如何实现的。2.实现了内部信息的隐藏。PTA(形状)中将长方形的长宽、圆的半径封装起来,用户就不需要明白实现的具体细节。
和封装有关的关键字:public
(公共的),private
(私有的),default
(默认的、无符号),protected
(保卫的)
8. 结对编程实践(未完成,0分)
找一个水平相近的同学完成1-2题实验题。开始编程前,可先对内容进行讨论。
写出体验报告,包括以下内容:1.对方姓名。2.所完成的题目。3.感想。4.照片(上次很多同学并未贴照片,请贴上)
姓名:郑玉波。PTA的7-2 jmu-Java-03面向对象基础-02-构造函数与初始化块。感想:结对编程的优势我想就是一来能让自己有两种想法一起思考问题,结对伙伴的想法、代码切入点都不一样,这个时候进行交流,可以学到别人的想法,这是一个人做不到的,所谓“艺多不压身”,做题的方法多了,还担心题目做不出来吗?二来当我将我的代码给对方看的时候,许多错误点在对方发角度反而看的很清楚,两人交流可比一人蛮干进步的快。
9. 选做:Runnable Jar
按照大神博客园上面的步骤来,果然,一会就出问题了,图1,在“Launch configuration”中找不到我要的main类出口啊,绞尽脑汁百度找到了问题所在.如图2先选中main类,找到运行方式(我的是中文版的,网上是英文教学),点击运行配置,进去后勾选图3的两个选项,这样就解决了我的第一个问题。接着要能用命令行运行,看着博客园的命令,我直接使用了,结果跳出个框,但是是一闪而过(2333333,我眼睛不是高速摄像机),好吧,我一定是哪里有错了,我想换一个命令,用"java -jar time.jar",竟然成功了!即图4(给自己鼓掌。。)。
3. 码云及PTA
3.1. 码云代码提交记录
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
3.2 截图PTA题集完成情况图
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中,可使用最新版的代码统计工具的-history
参数,详细用法见项目wiki地址。
统计的竟然没有1与2的,直接来3,莫非是之前的记录没了?
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 191 | 191 | 18 | 18 |
2 | 571 | 380 | 19 | 1 |
3 | 1027 | 456 | 20 | 1 |