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就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

参考资料

posted @ 2017-03-11 23:33  0x14b7狄  阅读(534)  评论(8编辑  收藏  举报