20155312 2006-2007-2 《Java程序设计》第四周学习总结
课堂笔记
- Ctrl+shift+T调出三个窗口,分别是“vi编写代码”,“java,javac编译运行代码”,“JDB调试代码”。
- 用Alt+1/2/3切换窗口
- javac -d bin -g src/...调试
- Path,ClassPath,SourthPath
- jdb(java调试命令) -classpath bin ..(文件名)
- run运行
- stop设断点
- 行断点
- 方法断点
- 条件断点(Ubuntu×)
- 临时断点(Ubuntu×)
- help(查看帮助命令)
- stop in HelloJDB.main(进入函数)
- 单步运行
- next(直接运行完函数)
- step(进入函数中单步跟踪)
- locals(局部)
- print i(打印变量的值)
- list(看源代码运行到哪里),soursepath src;list(指出sourthpath)
- stop at HelloJDB:5(在第五行设置断点)
- stop(查看断点)
- run(重启代码)
- stop at HelloGDB:12(为了从上一个断点直接运行到这个断点) + continue
教材学习内容总结
- OCP(Open-Closed Principle,开放-封闭原则):软件实体(类,模块,函数等)应该对扩充开放,对修改封闭。
- OCP可以用以下手段实现:(1)抽象和继承,(2)面向接口编程。
- LSP(Liskov Substitusion Principle,Liskov替换原则):子类必须可以被其基类所代;使用指向基类的指针或引用的函数,必须能够在不知道具体派生类对象类型的情况下使用它。
- ISA原则是指功能上的。(行为功能(behavior)不是内在的、私有的,而是外在、公开的,是客户程序所依赖的接口)
- UML:一种通用的建模语言,可以为许多面向对象建模方法的用户广泛使用。
- 覆盖与重载区分:
- 重载是让同一方法名的方法可以处理和返回不同类型的数据,而覆盖是在子类中改写父类的方法。
- 相同点:被覆盖(重载)的函数的函数名必须是一样的。
- 不同点:覆盖的函数的函数参数表必须和被覆盖的函数的参数表一样,重载的函数的函数参数表必须和被重载的函数的参数表不一样。
- abstact使用
- 注意要同时把public class ...声明为abstract类型,否则无法通过编译。
- 抽象类不能使用new生成对象。
- 抽象类必须被继承,抽象方法必须被重写(在子类中操作抽象方法,否则子类也是一个抽象类)。
- 思考题1:“Square(正方形)类继承Rectangle(矩形)类合适吗?”
- 答:合适,因为正方形是一种矩形,只需要在正方形类中
extends
继承长方形类,并扩充边长相等的方法。
- 答:合适,因为正方形是一种矩形,只需要在正方形类中
- super与this只能择一调用,并且只能用在构造函数的第一行。
- instanceof:当左操作数是右类型的子类型,返回true。
- hashCode():public int hashCode()返回该对象的哈希码值。覆盖equals()一定要同时覆盖hashCode()。
- OCP:数据库认证专家。
- ISP(Interface Segregation Principle,接口分离原则):客户不应该依赖他们并未使用的接口。
- 代码怎么样才能有弹性又不过度设计:
- DRY是 Don't repeat yourself 的缩写,意思是"不要重复自己"。
- YAGNI是 You aren't gonna need it 的缩写,意思是"你不会需要它"。
- Rule of three 称为"三次原则",指的是当某个功能第三次出现时,才进行"抽象化"。
- Lambda:直接对应于其中的lambda抽象,是一个匿名函数,即没有函数名的函数。
教材学习中的问题和解决过程
- 『问题1』:书7.2.2匿名内部类中的“ClientQueue.java”文件编译提示如下:
- 「尝试1」,在```public class ClientQueue```后加```implements ClientListener```结果无法通过编译,截图如下:
-
『问题1.1』:为什么在ClientQueue中可以直接使用接口ClientListener而不用进行implements?
-
『问题2』:书中匿名内部类的语法没看懂,不知道例子是怎么使用匿名内部类的,不知道例子中哪个是匿名内部类。
-
『解决』:在做课后题是终于理解了什么是内部类,它的基本形式是
new 父类(或接口)() { ... }
内部类就是大括号中间的部分。- 「注意」:匿名内部接口中不能添加父接口没有定义过的方法(如课后题第8题,会显示编译失败,如果在Some中添加
void doService();
可以编译成功)。
- 「注意」:匿名内部接口中不能添加父接口没有定义过的方法(如课后题第8题,会显示编译失败,如果在Some中添加
-
『问题3』:ArrayList中
.add(E e)
remove(object o)
get(int i)
语法怎样使用? -
『解决』:查看API
-
get(int i)
:返回列表中指定位置的元素; -
remove(Object o)
:移除第一个与o相同的元素; -
add()
:添加某元素在列表尾。 -
截图如下:
-
- 『问题4』:
String.format("...")
这句的具体用法是什么? - 『解决』:参考博客JAVA字符串格式化-String.format()的使用,我了解到它的功能有很多,主要是让字符串按照指定格式输出。
- 『问题5』:第六章课后第3题为什么显示的是默认定义的toString()返回值?
- 『解决』:因为Some中重新定义的方法是
ToString
而不是toString
,而System.out.println()
调用默认的tosTring()以取得字符串描述来显示。「注意」:如果要重新定义toString()类型必须是public
。- 『问题5.1』:重新定义toString()时一定要使用
return String.format("...")
的形式吗?直接使用return "..."
可以吗? - 『解决』:尝试了一下是可以的。
- 『问题5.1』:重新定义toString()时一定要使用
- 『问题6』:继承父类构造函数时,一定要使用
super(...)
吗?可以用this()
吗? - 『解决』:试了一下,只能用super(),否则会编译错误,显示“无法将类 Some中的构造器 Some应用到给定类型;”(Some为父类)
代码调试中的问题和解决过程
代码还是以敲书中代码为主,一些代码片段自己做了补全。没有出现难以解决的问题,大部分都在微调后得到解决。
代码托管
- 提交过程截图:
- 代码量截图:
上周考试错题总结
-
1.填空:Linux Bash中,(grep )命令可以进行全文搜索。
-
原因:搜索命令掌握不熟,考试时没有查阅自己的笔记。
-
分析:grep能使用正则表达式搜索文本,并把匹配的行打印出来。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。具体用法课参考博客linux grep命令详解。
-
2.填空:~0b1010的十进制值是(-11)
-
原因:先做了下面的题,结果时间不够用了。计算方法已掌握。
-
3.填空:System.out.println(52+25+””);的结果是(77)
-
4.填空: p88 DecimalDemo2.java中 operand-openrand2的值是0.2。(X)
-
原因:我用的旧版书里没有operand-openrand2。准备再借一本新版书。
-
5.判断: Java中,=与==并没有在基本类型和类类型的不同。(OK)???
-
6.填空:可以使用java.util.Arrays的(fill())方法把数组初始化成相同的值。
-
分析:查看了API,发现fill(类型名 [] a,类型名 b)就是把数组a中每个元素都初始化成b。截图如下(以char类型为例):
-
7.填空:“30”转化为byte类型的30的语句是(Byte.parseByte(“30”);)
-
解析:查看java.lang.Byte的API,截图如下:
-
原因:自学时不细致,没注意到这个知识点。
-
8.填空:Java中方法参数只用(传值)调用。
其他(感悟、思考等,可选)
上一周学习看了老师写的学习指导,但遇到一部分自己不清楚的问题就跳过了并没有解决。这周的学习吸取了上周的教训。发现自己学第4,5章时很认真,但测验时有很多知识点丝毫没有印象,可能是因为教材版本的原因,也可能是自己自学能力比较差。下一阶段的学习的主要目标是提升自身自学能力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 4/0 | 1/3 | 28/80 | 下载了JDK和GIT |
第二周 | 61/4 | 1/4 | 20/108 | 在unbuntu中熟练编写程序,熟练进行文件、目录等操作 |
第三周 | 684/65 | 1/5 | 27/108 | 初步配置vim方便使用,会自己解决一些代码问题 |
第四周 | 1238/749 | 1/6 | 23/135 | 大部分自己补全的代码片段不会出现问题,渐渐具备脱离书本编代码的能力 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:21小时
-
实际学习时间:23小时
-
改进情况:
每天都在学习java,而不是等 周四周五才开始进入学习状态。学习效率提高,实际学习时间和计划学习时间接近。