20172302 《程序设计与数据结构》第四周学习总结
2018年学习总结博客总目录:[第一周](http://www.cnblogs.com/hzy0628/p/8539037.html) [第二周](http://www.cnblogs.com/hzy0628/p/8584976.html) [第三周](http://www.cnblogs.com/hzy0628/p/8642935.html) [第四周](http://www.cnblogs.com/hzy0628/p/8671888.html)
教材学习内容总结
- 第四章&第七章
1.明确类与对象的关系,对象由类定义,类是建立对象的蓝图,同时对象有自己的数据保存空间,也有相应的状态。
2.类的分析:类的结构包括属性和操作。同时还有类的方法的构造,接下来就是实例数据的创建和UML类图的组成和使用方法。
3.对对象的封装:三种可见性修饰符{public,private,protected},其中public和private使用规则(见下图),还同时讲到访问器(assessor)和修改器(mutator)。
| | public | private |
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 变量 | 违反封装性 | 强化封装性 |
| 方法 | 为客户提供服务 | 为类中其他方法提供支持 |
4.具体的方法的分析,包括return语句的使用,还有参数(parameter)分为形参和实参,两者的认识。以及在方法构造过程中的局部数据的使用。
5.构造方法的两点不同之处:(1).构造方法名与类名相同 (2).构造方法不能返回值。
6.软件开发四个过程:(1)确定软件需求(2)软件设计(3)实现软件设计(4)软件测试 。
7.静态类成员(使用static修饰符进行修饰):静态变量(类变量)、静态方法(类方法)的介绍。
8.类间关系:依赖、聚合、继承。依赖性也存在于同一类对象之间;聚合(aggregation)关系是依赖关系的特殊类型。
9.this引用:this引用允许对象引用自己,主要功能(见下)。
(1)this调用本类中的属性,也就是类中的成员变量;
(2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。
10.接口(interface):一组常量和抽象方法的集合。接口不能被实例化;抽象方法是指没有实现的方法,即没有代码体,包含声明列表的方法声明头后面仅跟一个分号。见下图简单的接口:
public interface Nameable
{
public static setName(String Name);
public String getName();
}
类通过实现定义在接口中的每个抽象方法来实现这个接口,实现接口的类需在类声明头部使用保留字implements,再给出接口名,类中必须实现至少一个接口中的抽象方法,同时也可以定义其他方法。多个类可以实现同一个接口,一个类也可以实现多个接口。同样还有介绍的Comparable接口和Iterator接口。
11.枚举类型:枚举类型属于一种特殊的类,枚举值作为枚举类型的实例。
12.方法设计:这里的设计主要是针对较为复杂繁琐的程序而言,有两个探讨的问题:(1)方法分解(2)方法参数的传递方式。
13.方法重载:可以使用具有不同参数表的相同方法名调用多个方法。多个重载方法可以根据由方法的参数个数、类型及参数顺序来区分。
教材学习中的问题和解决过程
-
问题1:我对于书上调用toString这个方法并不是很理解,不调用也能完成输出,为什么非要去调用它?
-
问题1解决方案:我自己从网上查了查,但也不是很懂,最后问了老师,具体的在代码调试解决的第二个问题。
用
System.out.println()
输出一个对象的时候,java默认调用对象的toString()方法。一般你要覆盖这个方法,这样根据覆盖逻辑你就可以输出自己的对象。比如你定义一个类User,有id,name属性,你直接输出一个user对象的话System.out.println(user)
,得到的只是全限定名@地址首地址 。如果你在User类里面覆盖这个toString方法的话就能输出你要的。比如:
public String toString(){
return "user name is:"+this.name+";"+"user id is:"+this.id;
}
这样你输出一个user对象就是
User user = new User(1,"zhangshan");
System.out.println(user);
得到:
user name is :zhangshan;user id is: 1;
-
问题2:SR4.23 Account 类中哪些方法是访问器方法?哪些是修改器方法?哪些是服务方法?
-
问题2解决方案:这里参照例题4.4:其中getBanlance是是访问器方法,toString也可以归做为访问器访问器方法,因其返回的是关于对象的信息,然后deaosit、withdraw、addInterest方法都可以提供修改器和访问器的功能,以上方法都属于服务方法,因为他们具有公有可见性可以为客户提供服务。
-
问题3:第七章学习中由SR7.9想到的为什么main方法必须是引用静态的变量?书上给的答案很模糊,并不能说出它的含义。
-
问题3解决方案:从博客园中找到了这个的答案(不太清楚对错),但说的还是比较详细的。
-
问题4:学习书上接口这一节时是看懂了书上的那个例题,但不明白明明没有这个接口也可以照常使用,为什么非要去写这么一个接口?
-
问题4解决方案:于是我就去查找Java中接口的用途,很巧在知乎上发现了一个很有意思的答案,这里放一下。
当然这个还是比较形象的一个说法,下面再列一个知乎上的答案,
能问这个问题,说明(1)你很会思考(2)编程水平还是处于起步阶段。“接口是个规范”,这句没错。“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。比如说:我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。这两个对象是什么类型呢?Object a,b?肯定不行,a > b 这样的语法无法通过编译。int a,b?也不行?一开始就说了,不一定是数字。....所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 <、> 这样的运算符。因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。
两个都是提到问这个问题的都是编程的新手,这个只有新手才会问吗?看完这个还算是理解一点了,接口也就是一种规范的表达,但主要还是觉得可能编程的前期可能用接口的可能性不是很大。
代码调试中的问题和解决过程
-
问题1:首先就是周一布置的实践活动,由于上周对包装器理解不够,这次实践对我来说要难一点,这次的实践是将一个随机数以二进制和十六进制输出出来。
-
问题1解决方案:最后是在网上搜索了相关的办法,将这个解决,后来才知道题目要求的是随机数,而不是随机整数,又是不会了,最后是两种答案都可以,第二种在码云上已上传。
-
问题2:由于上面对toString方法的不理解,导致在编写代码过程中也出现了问题,首先就是项目PP4.2,我编写的类的代码和程序的代码及运行结果如图。
- 问题2解决方案:一开始也查了许多资料,感觉还是不太懂。最后问了老师,老师告诉的是这产生的是对象的地址,然后给我分享了一个网页,看完这个才算弄明白了。
如果一个java对象改写了toString方法,就不会打印出内存地址,而是直接调用了他的toString方法。在源码中,比如
System.out.println()
方法,用它来打印一个对象。它会首先判断一下该对象是否为null,如果为null,就直接打印出一个null的字符串。如果不为null,就自动调用该对象的toString方法。所以,如果改写了toString,就会直接调用toString方法了。如果没有,就是调用父类Object中的toString方法,也就是打印出内存地址。
也就明白了是我最后设置的那个toBoolean导致后面我的输出的为内存地址,而不是对象的属性,最后一条语句我用的Light1.turnoff()
,这种情况下是可以输出对象的属性,这里可算是弄明白了。
-
问题3:书上的例题7.3、7.4、7.5这里看不太明白,到后面的编程项目不敢动手,不清楚整个程序是什么意思,尤其是做除法之后的步骤。
-
问题3解决方案:后面那天直接问的老师,弄懂了整个程序的含义,主要是那个做除法之前的取倒数这个方法没看懂,然后还有后面的约分化简方法,这个就要求必须求出分子分母的最大公约数,使用的是数学上的更相减损术,同时数学中的辗转相除法,也是可以完成这个求最大公约数的要求,这样看下来整个程序也就比较自然了,其实主要自己没看注释,注释很重要,有时就是英语那些单词不认识,自己也不愿意去查,就总是看不懂的理由,以后要多动手,多去想。
-
问题4:呈上问题,一开始是使用网上给出的调用java.math.BigDeximal包,调用之后输出的始终为两个相等,按照题意应该是两个不等,编写PP7.4时我编写出来的结果始终不正确,那个没有截图下来,
-
问题4解决方案:参看了其他同学的设计,也向其他同学问过,最后自己也完成了这个项目,结果如图:
代码托管
上周考试错题总结
1.
- 解析:题意为当你在没有进行初始化时使用一个变量会发生什么情况?这个大多数情况下会在被编译器编译的过程中出现错误,但是也有少数情况会逃过编译器的检测,但是会在运行期间发生运行错误。
2.
- 解析:题意:实例化意味着什么?实例化就是代表着在类中创建一个新的对象。
实例化是指在面向对象的编程中,通常把用类创建对象的过程称为实例化。
3.
- 解析:题意为当你使用了Random类而并没有用import声明引用会发生什么情况?这种情况会是出现编译错误,不会完成编译,误选了A。
4.
- 解析:别名的含义:别名就是同一个对象同时有了两个名字,也就是在说两个不同的引用变量指向同一内存单元(地址),也就是同一个对象。
5.
- 解析:在String类里面,compareTo这个方法的作用是:返回一个整型数,负值、0、正值分别表示本对象的字符串按字典先后顺序位置先于、等于、后于对比对象的字符串。这个我们可以来测试一下。从图中可以清晰的看出这个方法的规则。
6.
- 解析:API:Application Program Interface
API:应用程序接口(API:Application Program Interface)。应用程序接口是一组定义、程序及协议的集合,通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过调用 API 函数对应用程序进行开发,可以减轻编程任务。 API 同时也是一种中间件,为各种不同平台提供数据共享。
7.
- 解析:使用Random类比使用Math.Random要有哪些优势。Random类可以产生好几种随机数生成器,而且可以是在一定范围或是没有范围的整型数,还可以产生浮点数,并且可以重新初始化随机数生成器,但它没有说是比Math.Random使用起来要更有效,没有这种说法。
8.
- 解析:NumberFormat类有哪些功能,它可以产生本地化的当前货币格式,还可以返回本地化的当前百分率格式的对象,也当然可以显示格式化后的内容,但它不能做到在格式化过程中截断他们的显示。
9.
- 解析:DecimalFormat有哪些NumberFormat没有的功能:它可以精准控制要显示的位数,也可以控制前导0的存在,它没有截断值而不是循环它的能力,更没有显示时自动显示“%”的能力。
10.
- 解析:这个题实际上是在考察"=="和"equal"的区别,这两个其实并不等价,我查的资料是这样的。
一、比较对象为基本数据类型(byte,short,char,int,long,float,double,boolean)比较两个基本数据类型是否相等用,因为只有类才会有equals方法。备注:String不是基本数据类型
二、比较对象为引用数据类型euqals和本质上都是比较比较的是两个对象的引用(内存地址)是否相同。equals()是Object类的方法 ,object类是所有类的基类,所以每个类都会继承equals()方法。但在String,Integer,Date在这些类当中重写了equals方法,而不再是比较对象在堆内存中的存放地址了,而是比较它们指向的实体(内容)是否相同。
但也有网上资料说这个具体理解需要哈希码知识,资料放置参考处了,具体的这个还不太明白。
11.
- 解析:Math类的所有方法都是静态(static)方法。静态方法可以通过类名称直接调用,而无需事先实例化的对象,所以这句话是正确的。
其他(感悟、思考等)
感悟
- 这次十天的学习真的任务量太大,而且也没有前面5、6章的基础,书上的例题好些都看不太明白,尤其是第七章的学习,很费力气,感觉还是好多都不太懂。代码实现也是有很多困恼,所以这次对书上的编程项目也完成也比较少。现在学着感觉很吃力,而且总是在觉得没有时间,好多东西都没有去深入的理解,同时觉得近期也没有什么进步,也不太清楚其他同学都是怎么学的。
- 最近接连好几周考试的成绩也不满意,周测的成绩一直在10多名,总觉得投入的时间也不算少,但就是收获不大,有点怕落后,可又好像没有一点办法。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 157/157 | 1/1 | 15/15 | |
第二周 | 382/539 | 1/2 | 16/20 | |
第三周 | 317/856 | 2/4 | 15/18 | |
第四周 | 996/1852 | 1/2 | 24/25 |