20172317 2017-2018-2 《程序设计与数据结构》第3周学习总结
教材学习内容总结
- 探讨了有关类与对象的概念,了解了所谓引用、实例化、构造方法等术语的具体含义,大概吧
- 粗略的学习了String类所提供的一些其他的方法,Amazing!
- 了解了包的概念,以及各种类其实是包含在不同的包中的,前辈们帮我们解决了一堆复杂的东西,赞美前辈!
- 学习了非常实用的Random类和Math类,以及感觉不是十分实用的NumberFormat类、DecimalFormat类
- 对枚举型变量以及包装器类有了一定的了解
教材学习中的问题和解决过程
- 问题1:Java的“垃圾回收”
问题1解决方案:
当一个对象所有的引用都丢失(可能是由于重赋值)后,它就再也不能为程序所用,即程序中不能再引用该对象的方法或使用它的变量。此时,该对象被成为“垃圾”
如果这句话并没有错而且我的理解也没错的话,那么假设我写了一段代码,其中我定义了一堆String对象(比如String a,String b,....String z),但是我只引用了其中的一个String对象(String a),则其他的没被引用过的对象都成了“垃圾”?这个是没法实验出来的,因为终究不知道其他的对象究竟有没有被处理掉。
至于“垃圾回收”,根据百度的答案似乎是有两个因素决定“垃圾回收器”回收垃圾的标准:1.给对象赋予了空值null,以下再没有调用过。2.给对象赋予了新值,既重新分配了内存空间。为什么感觉和上面有些自相矛盾...- 问题2:告诉我,72页到75页究竟讲了啥
- 问题2解决方案:
学习,为什么会难?因为记忆?因为枯燥?因为繁杂?不,当你面对一堆你完全无法理解的文字的时候,学习这坨屎就开始发威了,这时候学习这个词,已经进化成了等同于诅咒、地狱、永劫之类的同义词了。
废话少说,主要的问题有这些,但远不止这些:
第一是不太清楚方法、对象、类之类的具体关系,我知道我知道,课本31页已经讲的比较清楚了完蛋了,看来基础不牢,通俗点来讲对象与类的关系,比方说现在有个类,这个类是“狗”,那么现在在你眼前的一只哈士奇就算是在这个类底下的一个对象,而这只哈士奇会摇尾巴、吠叫等行为,行为通过方法体现。我应该没讲错吧...
第二是别名的概念,光看书本上的讲述实在是一头雾水,只好向着茫茫的网络求救,于是获得以下的信息:“别名现象:是java操作对象的一种基本方式,当对引用型变量进行赋值操作时,可能出现别名现象,两个引用变量共同指向同一个对象,当一个引用对对象进行改变时,另一个引用变量的对象值也跟着改变”似乎逐渐明白了“别名”的意思,令我感到惊讶的是书上name1和name2的示例,最后name1和name2都引用了相同的对象,而不是我所猜想的“将name2所引用的对象改成和name1引用的对象相同”,那么这样来说name2原来所引用的对象就成了“垃圾” - 问题3:包装器类?
- 问题3解决方案:
课本没有代码实例,所以无法理解,只好向万能的百度求救,得到了以下的解释:“包装类即使把基本类型变成对象类型”........呃,这听上去并不是十分靠谱,包装器类似乎目前并不是十分的需要,所以就选择性无视吧.... - 问题4:NumberFormat类?真的有用吗?
问题4解决方案:
在敲打书上的示例代码“例3.4”时发现的问题。在例3.4中使用了NumberFormat.getCurrencyInstance()
和NumberFormat.getPercentInstance
,但是这样输出来和用println
方法在相应位置加一个‘$‘和%
没有区别,所以我质疑了这地方使用NumberFormat
的必要性。刚开始并没有发现NumberFormat
和我说的那样子直接输出的方法的区别,直到后来看了一下其他同学的输出结果.......‘¥‘....?为什么他们输出了这个不同的钱币符号?后来才了解到NumberFormat.getCurrencyInstance
这个会自动的输出电脑设置所在的国家的钱币符号,但是如果像我的方法那样固定输出某个钱币符号则不会有这样的效果。
代码调试中的问题和解决过程
- 问题1:PP3.3的电话号码生成问题
- 问题1解决方案:
至少题目条件要的“前三个数字中不能有8或者9”这个地方倒是比较容易的想出来了,我的解决方法是对前三个数字进行”分别确定“的方式,前三个数字分别在0至7之间生成随机数。
但是接下来的条件就开始发疯了:"中间三个数字组成的数不能大于655"。嗯?不能大于655?很明显的,用于前三个数字的方法在这里并不能奏效,那么只要把随机数的取值范围缩小到0-655不就行了?
话虽如此,但真正的这样实行的时候却出现了一个严重的问题,那就是由于给中间的三个数的取值范围是0-655,所以可能会生成两位数甚至是一位数!(最后的四位数亦是如此,有可能会生成3位数之类的)。于是,在最迷茫的时刻,救世主降临了,祂为我们指出了一条明路:nextInt(556)+100
巧妙的办法!惊奇的思路!绝妙的解决!不愧是救世主,在顷刻之间,笼罩在我头上的阴云烟消雾散! - 问题2:error:incompatible types:possible lossy conversion from double to int
- 问题2解决方案:
这个问题.....是不是有几分的眼熟?咳,这个问题其实在敲代码的时候不仅仅出现了一次,而是很多次,而且每次都是在使用了Math类的时候出现的。
首先是出现在PP3.2的情况,出现了这一条语句,这个错误指向在这一条代码中:result = Math.pow(x,3)+Math.pow(y,3);
如同标准剧情一般的,不知道发生了什么的我陷入了迷惑,只好从错误信息中入手:"from double to int"?不应该啊,在这个程序里x,y,result都是int型数值啊?怎么其中有数就成了double型了?在不解中,想出了一个比较糟糕的处理方式:把x,y,result全部定义为double型的值,但是尽管这样能够将错误信息解决,,却是治标不治本的方法。莫非.....是Math.pow()的问题?上网一查,发现Math.pow()竟然真的输出来的其实是double型的值!知道了问题出在了哪里,问题就很容易解决了,在Math.pow()前面加一个(int)进行强制转换。
然后是出现在PP3.5的问题....和PP3.2的情况一样,跳过。
然后是出现在PP3.4的问题....根据这一题的要求,首先输入一个浮点值,然后要分别输出不大于该值的最大整数和不小于该值的最小整数。分析完要求之后,意识到Math.floor和Math.ceil可以满足这个题的要求。但问题随之而来,错误信息表明错误出现在lowerValue = Math.floor(baseValue)
和higherValue = Math.ceil(baseValue)
这两条语句中,由于有了解决PP3.2,PP3.5的经验,所以第一念头便是Math.floor和Math.ceil出了问题,如同预期,在它们之前加上(int)即可解决问题。 - 问题3:.class文件?两个?
- 问题3解决方案:
在检查自己的.class文件的时候发现了一个有意思的现象:例3.6的IceCream.java文件在javac之后生成了两个文件,但这两个文件运行的结果却是一样的
上网查找之后得到了一个解释:“每一个类对应一个class文件,编译一个java文件会生成多个class文件,说明在此Java文件中调用了多个类”
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
What value will z have if we execute the following assignment statement? float z = 5 / 10; (如果我们执行下面的赋值语句,得到的z将会是什么值?)
A . z will equal 0.0 (z将等于0.0)
B . z will equal 0.5 (z将等于0.5)
C . z will equal 5.0 (z将等于5.0)
D . z will equal 0.05 (z将等于0.05)
E . none of the above, a run-time error arises because z is a float and 5 / 10 is an int (以上都不对,因为z是float类型,5 / 10是int类型,所以会发生运行时错误)正确答案:A 我的答案:B
If x is an int and y is a float, all of the following are legal except which assignment statement? (如果x是一个int类型的数,y是一个float类型的数,下面所有赋值语句中哪个不合法?)
A . y = x;
B . x = y;
C . y = (float) x;
D . x = (int) y;
E . all of the above are legal (以上全部合法)正确答案:B 我的答案:A
error: incompatible types: possible lossy conversion from float to int
,如果想要B选项合法,则需要进行强制类型转化x=(int)y
Which of the following is true regarding the mod operator, %? (关于求余运算符%,下面哪项是正确的?)
A . It can only be performed on int values and its result is a double (它只能执行int类型的数值,其结果是double类型的数)
B . It can only be performed on int values and its result is an int (它只能执行int类型的数值,其结果也是int类型的数)
C . It can only be performed on float or double values and its result is an int (它只能执行float或者double类型的数值,其结果是int类型的数)
D . It can only be performed on float or double values and its result is a double (它只能执行float或者double类型的数值,其结果是double类型的数)
E . It can be performed on any numeric values, and the result always is numeric (它可以执行任何类型的数值,其结果始终是数值正确答案:E 我的答案:B
尽管通常都是整型数值进行
%
的运算,但事实上浮点型数值也可以进行%
的运算,比方说6.1 % 3.2
算出来的结果是2.9尽管输出的是2.8999999....计算的方法和在整形数值计算时的计算方法基本上是一样的Java is a strongly typed language. What is meant by "strongly typed"? (Java是一种强类型语言。“强类型”指的是什么?)
A . Every variable must have an associated type before you can use it (在使用变量之前,每个变量一定都有一个与之关联的类型)
B . Variables can be used without declaring their type (变量可以在不声明其类型的情况下使用)
C . Every variable has a single type associated with it throughout its existence in the program, and the variable can only store values of that type (在程序中,每个变量都有一个与之关联的类型,而变量只能存储该类型的值)
D . Variables are allowed to change type during their existence in the program as long as the value it currently stores is of the type it is currently declared to be (变量存在于程序中时允许改变类型,只要它当前存储的值是当前声明的类型)
E . Variables are allowed to change types during their existence in the program but only if the change is to a narrower type (变量存在于程序中时允许改变类型,但只能缩窄转换)正确答案:C 我的答案:D
错误原因:看着C选了D,喝了
A double is wider than a float and a float is wider than an int. (一个double类型的数比float类型的数更宽泛,一个float类型的数比一个int类型的数更宽泛。)
A . true
B . false
正确答案:A 我的答案:B
我都不知道这题我是怎么选错的,可能是看错的吧,喝了
- A variable of type boolean will store either a 0 or a 1. (Boolean类型的变量将被存储为0或1)
A . true
B . false
正确答案:B 我的答案:A
布尔型的值只有两个有效值,但是不是以0和1存储,而是“true”和“false”这两个保留字。尽管如此,在C,C++,C#中布尔型确实是以整型的0和1来存储的
- The values of (double) 5 / 2 and (double) (5 / 2) are identical. ((double) 5 / 2和(double) (5 / 2)的值是相同的。)
A . true
B . false
正确答案:B 我的答案:A
(double)5/2
结果为2.5,(double)(5/2)
结果为2.0,前者是输出5除以2的double型值,后者是先输出5除以2的整型值,再把这个整型值转化成double型值,所以输出2.0
其他(感悟、思考等,可选)
- 1.代码调试时候出的问题变得越来越少了,是我越来越不认真了,还是我变强了?嘛,人总是会向着对自己有利的方向思考,就
无耻的当做是我变强了吧 - 2.随着记忆的东西的增多,一些东西正在慢慢遗忘,准备开始复习
- 3.对不起,英文教材这块肉啃不动了,不然我就要猝死在课桌前了
- 4.不知道为什么我放各个代码的目录下....又多了一个基本相同的目录?难道是在搞IDEA时候搞出来的吗?删了会怎样?
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 91/91 | 1/1 | 20/20 | |
第二周 | 284/375 | 1/2 | 18/38 | |
第三周 | 746/1104 | 1/3 | 22/60 |
计划学习时间:20小时
实际学习时间:22小时
改进情况:感谢这周暂时停止的大物课,让我有更多的时间稍微搞一下程序设计的课程任务,代码调试时候出现的错误与前两周比较极大地减少了,可喜可贺可喜可贺