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},其中publicprivate使用规则(见下图),还同时讲到访问器(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

参考资料

posted @ 2018-03-31 14:18  ◕‿◕  阅读(501)  评论(4编辑  收藏  举报
© 2018 GitHub, Inc.