20155303 2016-2017-2 《Java程序设计》第三周学习总结
20155303 2016-2017-2 《Java程序设计》第三周学习总结
教材学习内容总结
第四章
-
学会如何查询Java API文件对于Java的学习很有帮助,可以了解到如何使用各种方法。
-
=是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考到同一对象。
-
对于二维数组array[][],由于有两个维度,必须先通过array.length得知有几列。对于每一列,再利用array[x].length得知每一列有几个元素。
-
System.arraycopy()的五个参数分别是:来源数组、来源起始索引、目的数组、目的起始索引、复制长度。使用Array.copyof()方法更方便。
-
注意区分“浅层复制”与“深层复制”。
第五章
-
如果想存取对象的数据成员,可以通过“.”运算符加上数据成员名称。如:
String number; CashCard card1 = new CashCard(); card1.number = A001; }```
-
在对象数组成员前加上
this
关键字,表示将参数的值,指定给这个对象(this)的各个数据成员。如:this.number = number;}```
-
使用private声明,可以封装不希望被改动的私有数据,而是只能以get的形式读取数据。
-
public:类公开;private:类私有。如果没有声明权限修饰的成员,只有在相同包的类程序代码中才可以直接存取,也就是“包范围权限”。
-
返回值类型不可作为方法重载依据。
-
被声明为static的成员,不会让个别对象拥有,而是属于类。
教材学习中的问题和解决过程
- 『问题一』
BigDecimal提供plus()、substract()、multiply()、divide()等方法,(好吧,其实是受英语思维的影响...)divide()方法在使用时应该把除数还是被除数放在括号里?
『解决』
编写了两组代码,分别将除数和被除数放在()里,疑惑得到解决。
- 『问题二』
使用private声明,只能以get形式读取数据,否则会报错。如下图:
『解决』
使用get()方法读取数据。如下图:
- 『问题三』
课本P109代码运行结果为NaN
,并不是平均值。
『解决』
课本P109提到,“可以让用户命令行自变量提供整数,计算出所有整数平均值”。由于我编译运行并没有使用命令行,所以才会出现NaN
的运行结果。
不太明白为什么会出现NaN
的运行结果,上网查询NaN相关资料明白,NaN,是Not a Number的缩写,在IEEE浮点数算术标准(IEEE 754)中定义,表示一些特殊数值(无穷与非数值(NaN))。也可修改程序如下:
- 『问题四』
课本上反复提到“反编译”一词,不太了解这是什么操作,大致觉得应该是根据代码运行结果及作用反推代码的过程。
『解决』
查阅了相关资料,在7款开源Java反编译工具这篇博客中了解到,需要安装相关软件进行反编译。如果之后的Java学习有需要,再进行进一步深入学习。
代码调试中的问题和解决过程
- 『问题一』
编写了CashCard程序不能运行,左侧图标没有绿色的小箭头。
『解决』
仔细观察代码,没有main()主函数。而Java是从main()主函数开始运行的,因此不能run
。
- 『问题二』
在改写课本上求平均值的代码时,第一次没有得到正确结果。如下图:
『解决』
do-while循环是先执行后判断,所以i多加了1,修改代码如下,得到了正确结果:
- 『问题三』
在运行课本P91代码的时候,wrapper1.doubleValue() / 3
的运行结果并不是课本上说的3.33333333333...一直循环下去,而是出现了这样的结果:
『解决』
设计代码,对Java中无限循环除法的运算规则进行进一步的了解。double的精度确实不如float精度高,而且对于循环小数也不是想象中的四舍五入。如下图:
代码托管
- 代码提交过程及代码量截图:
『注』本周初在IDEA上重新提交了之前的代码,所以本周编写的代码量为:1001-235=766。
上周考试错题总结
- Linux Bash中,查找当前目录中前天创建的Java文件的命令是
(find . –name *.java -ctime 2)
『考点』:①与时间相关的命令参数:-atime
:最后访问时间;-ctime
:创建时间;-mtime
:最后修改时间。以-mtime
为例,-mtime n
:n天之前的“一天之内”修改过的文件;-mtime +n
:n天之前(不包含n天本身)被修改过的文件;-mtime -n
:n天之前(包含n天本身)被修改过的文件。②当前目录为“.”,若根目录则为“~”。③Java文件的后缀为“.java”,所以可用“*.java”查找Java文件。
- ~0b1011的十进制值是(-12)
『考点』:计算机存放时,一个byte8位,1011存放为000010011。按题目要求“~”取反得到11110100,最高位(符号位)为1,表示该数为负数,因此所对应的数为(各位取反,末位加一)10001100,即-12.
- Java中,非零数字等价于true.(X)
『考点』:Java中,非零数字为false,零为true。
关于考试错题的一点思考
每次考试之前信心满满,考完试才发现漏洞百出,其实自己还有很多知识没有熟练掌握,很多概念没有深刻理解。学语言毕竟不能拘泥于“背过”代码或是概念,缺乏思考的机械性记忆绝不算是对一门语言的掌握。拿第一道题举例,上次错题分析只注重time的参数了,这次一拿到考卷就闷着头往上写,却忽略了“当前目录”和“Java文件”。其实这也说明一个问题,实践出真知,在虚拟机里运行我写的那个命令是绝对得不到想要的结果的。实践一次,出错一次,找到原因下次避免,才能不断进步吧。
学习感悟
三周过去了,我想我已经已经适应并热爱上这种自学模式了。从一名学生的角度来看,老师对课本单纯的讲解并不能使我们真正掌握什么,课后进行大量的练习实践才是根本途径。这三周,算是Java学习的一个开端,尤其是这一周,感觉难度比前两周有很大的提升,所以常常一学就是一下午一晚上。很多时候书上的都是伪代码,或是代码片段,甚至是有错误的代码,需要根据自己的理解补全才能运行。而自己的能力也就在这一次次修改代码中提高了。
目前我的学习模式是,每周一至周三修改前一周的博客,并学习新一周学习任务,在书中标出自己不懂的地方并查阅资料。从周三开始敲代码,并根据自己的理解学习进行修改调试。因此,目前我并没有做到每天编写一定量的代码,学习方法有待进一步改进。
有幸拜读刘未鹏著写的暗时间一书,目前还没有阅读完第一篇,已受益匪浅。书中“设计你自己的进度条”一节中提到,“如果你对整个目标的几个重大步骤有清晰的界定,能够对每个步骤的耗时作出靠谱的上界估计,你就不会对不确定的未来,不确定的时间投入感到恐惧,就不会被这种不确定感压迫到过早退出。”现在我们的学习正是借鉴了这种“进度条”模式。上学期第一次了解到要至少编写5000行代码的时候,说实话我有点怯懦了。不过,这种害怕的感觉很快被进度条上的数字打败,当代码总量破百的时候,当编写了第一个50行的程序的时候,觉得5000的目标其实触手可及。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 16/16 | 1/1 | 18/18 | 初步认识了Java |
第二周 | 219/235 | 2/2 | 28/46 | 学习了Java的基本语法知识 |
第三周 | 766/1001 | 3/3 | 23/69 | 了解对象与参考的关系,以及封装的概念与实现 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:25小时
-
实际学习时间:23小时
-
改进情况:按照N=3来计算,误差在可接受的范围之内。以后会加强这方面的训练,使计划学习时间与实际学习时间更接近。