20172301 2017-2018-2 《程序设计与数据结构》第4周学习总结
教材学习内容总结
- 第四章
- 类与对象的关系,类是对象的蓝图。
- UML类图的使用
- 封装的有关概念。(可见性修饰符:public private protected)
- return语句。
- 形参和实参
- 局部数据和实例数据
- 第七章
- 软件开发的步骤(确定软件需求,软件设计,实现软件设计,软件测试)
- 静态变量和静态方法
- 类间关系(依赖关系,聚合关系...)
- this的用法。常在构造方法中出现。
- 接口(Comparable接口,Iterator接口)
- 枚举类型
- 有关方法设计
教材学习中的问题和解决过程
- 问题1:书P111 return语句 中第一句话提到了:
在方法中声明首部中指定的返回值类型可以是基本数据类型、类名或保留字void。
我们经常在Java中输入`public static void main(String[] args)`,那么这个void和return能否一起使用,亦或他们的区别在哪里。
- 问题1解决方案:于是我首先从书上了解到,方法的返回值类型必须与方法声明首部的中规定的返回值类型一致。
然后,我百度了返回值,参考了资料:Java中返回参数值的几种状态
那么,我们可以简单划分为几类:-
Java中无参无返回值方法
-
Java 中无参带返回值方法
-
Java 中带参无返回值方法
-
Java 中带参带返回值方法
-
我们书上经常使用的是无参带返回值方法和带参带返回值方法。这时候,我们对于return语句的运用和有无返回值能有更系统的理解,便于后面代码的编写。
-
问题2:实参和形参的理解。
-
问题2解决方案:什么是形式参数?什么是实际参数?两者之间值如何传送?一切尽在:形参和实参的区别
>调用方法时,每个实参的值被**复制**后保存到相应的形参中。书上说:
形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。并且,这个传送是单向的。就是说
形参就是函数定义时参数表的各个变量,而实参就是调用函数时给函数的变量(写在函数名后的圆括号里)。通俗的说 -
问题3:什么是伪代码?
在课上老师讲解了代码大致分为3种。
1.伪代码
2.产品代码
3.测试代码 -
问题3解决办法:产品代码和测试代码我都了解,就是平常程序中的类文件和测试文件。那么这个伪代码是什么呢?假代码吗?并不。
什么叫伪代码?
那么我们可以了解到,伪代码多用于软件设计阶段,是一种简单的计算机语言。
例:if num>0 正整数
if num<0 负整数
else num=0 -
问题4:Java类间关系。依赖关系和聚合关系的区别。
如果说,聚合关系就像汽车和轮胎、引擎一样,那么聚合关系之间不也是存在依赖关系么?换言之,聚合关键就是“有”的关系。那么如何辨别依赖关系和聚合关系。 -
问题4解决方案:java--依赖、关联、聚合和组合之间区别的理解
就像是一个人(Person)要买车(Car)买房(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car 和 House。**但是**,Person类里并没有Car和House类型的属性,Car 和House的实例是以参量的方式传入到buy()方法中去的。**依赖关系:**
更多体现在**两个类是处在不平等层次上的,一个代表整体,另一个代表部分。** 是整体与个体之间的关系。**聚合关系:** - 我觉得现在应该好区分很多了。
-
问题5:Java中的接口有什么用?
-
问题5解决方案: 我觉得大部分人一开始都有这个疑问吧,什么接口?直接编写在类中多方便。所以我觉得,接口实际上就是一种类似“规范”。所以,我从网上查阅了别人的理解和看法。
Java 中的接口有什么作用?
java 接口的作用和好处
首先,接口确实是一种规范,统一标准。接口就是个招牌。
比如说你今年放假出去杭州旅游,玩了一上午,你也有点饿了,突然看到前面有个店子,上面挂着KFC,然后你就知道今天中饭有着落了。KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。那么为神马我们要去定义一个接口涅,这个店可以直接卖炸鸡腿啊(直接写实现方法),是的,这个店可以直接卖炸鸡腿,但没有挂KFC的招牌,我们就不能直接简单粗暴的冲进去叫服务员给两个炸鸡腿了。要么,我们就要进去问,你这里卖不卖炸鸡腿啊,卖不卖汉堡啊,卖不卖圣代啊(这就是反射)。很显然,这样一家家的问实在是非常麻烦(反射性能很差)。要么,我们就要记住,中山路108号卖炸鸡,黄山路45号卖炸鸡(硬编码),很显然这样我们要记住的很多很多东西(代码量剧增),而且,如果有新的店卖炸鸡腿,我们也不可能知道(不利于扩展)。反正,我的理解就是接口就是方便调用一个方法。更加的系统化。
-
问题6:是否所有类都需要重写toString方法。
-
问题6解决方案:在编写bulb类的时候呢,我输出了一段乱码。经过了解,因为我没有重写toString。那么什么时候应该重写toString,toString是否是必须重写的呢?
学长给了我指引:你的对象没有重写这个方法的时候调用会输出地址!你的对象需要被打印或者需以某种方式转换为字符串时就需要重写方法!因为你很多时候都会去做一个转换或者打印的操作所以最好重写一下。
我们再看一个例子:每个Java类都有的toString方法
那么,我们以后最好不要偷懒想不打toString了 - _-
代码调试中的问题和解决过程
-
问题1:不能编译
刚开始学第四章,照旧把代码打上,然后编译,然后运行,然后git...
然而很多同学都跟我有过一样的错误,我想明白是因为自己编译的类虚拟机不能识别。那么怎么解决呢,我就把方法和测试代码放在个Java文件中,可是还是不行。
-
问题1解决方案:怎么解决。学长给出了两种答案。
- 第一,同时编译类和测试程序。 例:
javac -d bin src/chap4/*
- 第二,把类编译到当前文件夹下。
后来,我仔细想想就豁然开朗了。
书P107:
例如:Die类保存在Die.java中。
真的需要仔细、认真看书!
- 第一,同时编译类和测试程序。 例:
-
问题2:Bulb类输出乱码。@665689
一输出看了这是啥啊,怎么还有@,乱七八糟。
-
问题2解决方案:百度到了结果,这个就是内存地址。内存地址?!
更懵了,我输出一个代码怎么还会输出内存地址
最后,问了学长才知道是toString的问题。
只要重写一下toString的方法就可以了。
所以我这时候,很认真思考了下toString的方法。
因为我在之后又在toSring上又发生了错误。
如图:这个是因为没有装箱,转换类型发生了错误。 所以我用了这个方法。
public String toString()
{
String b = Integer.toString(a);
return b;
}
- 问题3:对例7.4代码理解问题。
首先,构造方法时,为什么要乘-1?
然后,result = numerator + "";""
这个输出的是空?? - 问题3的解决方法:
-
我对第一个问题的解决办法就是实验。
我考虑到-1肯定和负数有关,如果我输入的是负数,那有什么结果。当然,程序肯定是不会崩溃的。那么我只要根据有无乘-1的方法进行计算即可。不得不说,我真会给自己找事情,这无疑是一个庞大的工作量。
结果如图:
-
第二个问题百思不得其解,所以问了老师。
其实很简单。
numerator什么数据类型?
int型啊!
result呢?
String型啊!
int型能直接转换String型吗?能
不能啊!
所以呢,这不就懂了么,只是转换类型的。
-
代码托管
上周考试错题总结
-
点算符的函数是什么? E
A.它可以将整数部分与浮点数的小数部分分开。
B.它允许在给定对象的引用时访问对象中的数据。
C.当给定对象的引用时,它允许在对象中调用方法。
D.它被用来终止命令(很多时候用英语来结束一个句子)
E.B和C都是正确的。
理解:浮点数内的点应该是一个小数点,而不是点算符。 所以A显然是错的 -
如果两个变量包含同一对象的别名。 E
A.对象可以使用别名进行修改。
B.除非有单独的引用,否则不能修改对象。
C.如果对象被修改,则创建第三个别名。
D.如果两个变量都设置为null,对象将变成一个“孤儿”。
E.案A和D是正确的。
理解:书P75指出:当一个对象所有的引用都丢失(可能是由于重赋值)后,它就再也不能为程序所用,即程序中不能再引用该对象的方法或使用它的变量。
对象成为“垃圾”以后,将会被回收。
-
字符串对象的属性是什么? E
A。他们的长度永远不会改变
B。最短的弦是零长度。
C。可以使用replace方法更改字符串中的单个字符。
D。字符串中第一个字符的索引是1。
E。只有A和B是真的。
理解:字符串是不可变的。这意味着一旦创建了字符串对象,就不能更改它。我们不可以改变字符串,只能去创建新的字符串。 -
如果在初始化之前尝试使用变量,会发生什么情况? E
A。语法错误可以由编译器生成。
B。执行期间可能出现运行时错误。
C。“垃圾”或“未初始化”值将用于计算。
D。如果变量未初始化,则使用0值。
E。答案A和B是正确的。
理解:
很多时候,编译器能够检测到未初始化变量的尝试使用,在这种情况下会产生语法错误。如果在编译器中使用脱逃检测,那么在使用时就会出现运行时错误。
所以语法错误和运行时错误都会出现。不过话说脱逃检测是啥。
在网上查查呗,没有?!那就是有道翻译错了,应该是可以编译,却不能运行。不过,我在搜索的时候竟然查到了同学的博客园,他用的也是脱逃检测。-_-
-
假设您编写了一个程序,该程序使用了Random类,但是您没有包含java.util的import语句。随机(或java.util.*)。当您尝试编译和运行您的程序时会发生什么。 B
A。该程序不会运行,但它会对丢失的类进行警告。
B。该程序不会编译—您将会收到关于缺失类的语法错误。
C。该程序将编译,但您将收到关于丢失的类的警告。
D。当程序试图访问随机类的任何成员时,会遇到运行时错误。
E。以上都不是
理解:这道题我错选了A,后来想想自己实践时,难道他会对丢失的类进行警告?! 不会吧,只是语法错误而已。 -
考虑以下两行代码。关于s1和s2,你能说些什么? C
字符串s1 = "testing" + "123";
字符串s2 = new String(“testing 123”);
A。s1和s2都是对同一个字符串对象的引用。
B。声明s2的行是合法的Java;声明s1的行将产生语法错误。
C。s1和s2都是对不同字符串对象的引用。
D。s1和s2会比较“相等”
E。以上都不是
理解:我能说些什么? 真的学计算机需要细心,一个空格,失之毫厘差之千里!
- 这两种设置字符串的方式产生了相同的结果: B
a) String string = "12345"
b) String string = 12345;
A . true
B . false
理解:第二个语句不能编译,存在关于不兼容类型的语法错误。从一个数字到一个字符串没有自动转换。而正确的应该这样。
a) String string = new String("12345");
b) String string = "" + 12345;
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 122/122 | 1/1 | 20/20 | |
第二周 | 487/609 | 1/2 | 18/38 | |
第三周 | 482/1091 | 1/3 | 22/60 | |
第四周 | 1357/2448 | 1/4 | 20/80 |
这周任务很重,同样也很充实。有时候学到夜里一点多,觉得java确实很苦,不过,任重道远。我们应该坚持下去。