鲸鱼的抽屉  

20155312 2016-2017-2 《Java程序设计》第五周学习总结

课堂笔记

  • 十个基本类型
  • 命令:ascii打印ascii值,
  • od -tx1 Test.java用十六进制查看代码,od -tx1 -tc Test.java显示出对应的原代码
  • 信息 = 位 + 上下文
  • 乱码原因:编码方式不同。
    • 每个汉字有个“国标码”。设定编码为utf-8
  • 自定义类型
    • java中: ;c语言中:结构体。
      • 用父类声明变量名的引用,子类生成新的对象。
      • is - a规则
      • 强制类型转换。(类型)父类->子类。
    • 具备抽象能力
      • 根据业务逻辑抓事物本质特征。
      • 不同业务系统中抽象的内容不同。
  • Don't Repeat Yourself: DRY
    • 使用变量:final int nstu = 84;
    • 使用函数:f( ... )——方法
    • 使用继承:抽象出父类。
    • bin 中的.class文件与src中的.java文件重复,无需托管。
    • .git 版本信息,.gitignore:其中注释的文件无需托管。eg:*.class
  • 面向对象的三要素:封装、继承和多态。封装是继承的基础,继承是多态的基础。
  • lamda表达式:实现匿名内部类的新方法。

教材学习内容总结

知识

  • API文档中带throws的必须使用try...catch,例如System.in.read()
  • 堆栈追踪信息中,最顶层是异常的根源,以下是调用方法的顺序。printStackTrace还接受PrintStream、PrintWriter的版本,可以将堆栈信息以指定方式至输出目的地。
  • try的括号中越后面撰写的对象资源会越早被关闭。

动手

  • 根据老师的课程指导,对P227Average文件进行了三组测试,用例为(1)8 9 10 0 ->平均9.00;(2)5 6 4 2 0->平均4.25;(3)5 4 8 0->平均5.67。期望结果与输出结果相同。
  • 输入u之后,显示出错截图如下:(产生异常的报错信息出现在第一行Exception in thread "main" java.util.InputMismatchException:非预期输入不匹配)(引起异常的程序代码信息在最后一行:at Average.main(Average.java:10)
  • 与 Average.java比较,Average2.java程序的优点是:利用try catch非法输入后可以显示友好的提示信息。
  • 与 Average2.java比较,Average3.java程序优点是:将try catch放在控制输入的while循环中,用户非法输入后可以回复正常流程。
  • 正则表达式概要:
    • 正则表达式可以看作是文本处理中“查找/替换"的领域专用语言。
    • 在信息安全专业课中有很多应用,比如数据安全验证、Web安全中的SQL注入防范、XSS攻击防范等。

教材学习中的问题和解决过程

  • 『问题1』:为什么8.1.2异常继承架构中第一个使用try catch打包System.in.read()的代码片段在补全后,结果与预测值不一样?(输入89,预测89,实际输出56)。截图如下:

  • 『解决方案』查询了API中关于System.in.read()的说明, 了解到System.in.read()返回的是输入数值的 ASKII 码。

  • 『问题2』:仍是问题1的代码段,其中ex.printStackTrace是进行了怎样的错误处理?

  • 『解决方案』:ex:表示异常对象,这个对象中包含了当前异常的所有信息;printStackTrace();则表示打印异常堆栈信息,一般是打印到控制台,方便问题的定位和分析(日记记录)。

  • 『问题3』:用ascii打印出来的表怎么看?截图如下:

  • 『解决方案』:查了一下,第一列Dec表示十进制,第二列Hex表示十进制对应的十六进制,第三列没有名字,是十进制对应的计算机中的字符。(97 61 a:表示a的ascii值为97,用十六进制表示为61)

  • 『问题4』:异常对象的名称可以随便定义吗?还是只能用书中出现的eex

  • 『解决方案』:进行了尝试,将其改成自定义名称hh,仍然可以编译运行。

  • 『问题5』:try {...}catch(IOException e){...}中++IOException++为什么前面不加java.io?

  • 『解决方案』:在我的虚拟机中第一种写法编译无法通过,应该把java.io补上。

  • 『问题6』:异常对象是并列关系时,try catch先后顺序有差别吗?

  • 『解决方案』:只要父类不出现在子类之前就可以了。

  • 『问题7』:InterruptedException是什么异常?

  • 『解决方案』:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。抛InterruptedException的代表方法有:

  1. Java.lang.Object 类的 wait 方法
  2. java.lang.Thread 类的 sleep 方法
  3. java.lang.Thread 类的 join 方法
  • 『问题8』:scanner.hasNext()是在判断什么?

  • 『解决方案』:查询了API,"Returns true if this scanner has another token in its input."这句话的意思应该是输入仍在进行就返回true吧。截图如下:

  • 『问题9』:builder.append(scanner.nextLine());builder.append('\n');这两句中的.append()是在做什么?

  • 『解决方案』:append函数的功能:以可写方式打开文件。如果文件不存在,将会自动创建。使用该函数,将会覆盖文件中的所有内容。所以这两句是将输入的一句写入文件,再换行。查询API截图如下:

  • 『问题10』:StringBuilder类的具体定义语法是什么?

  • 『解决方案』:查询了API,StringBuilder()是构造一个没有元素的字符串,最初的容量是16个字符。截图如下:

  • 『问题11』:老师给的代码,运行完m3()为什么会“Caught IOException in m1()...rethrowing”?返回主函数后为什么会“Caught IOException in main()”?

  • 『解决方案』:API中关于IOException的解释为“Signals that an I/O exception of some sort has occurred. This class is the general class of exceptions produced by failed or interrupted I/O operations.”意思是“当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。”由于在m1中调用m3(true)时参数genExc为true,在m3中执行 if (genExc)中的语句,新建异常对象,返回m1后接受到这个异常所以执行catch中的语句。

  • 『问题12』:9.1.1中Guest.java代码中guest.toUpperCase()是什么意思?

  • 『解决方案』:查询了API,其中toUpperCase()解释为:返回一个字符串,该字符串中的所有字母都被转化为大写字母。

  • 『问题13』:为什么用Set自动去掉重复字符串打印时,会有两个"[]"括号把字符串括起来呢?

  • 『问题14』:为什么打印9.1.3Words.java中的tokens时,只打印出第一个字符串呢?

  • 『解决方案』:String [] tokens表示tokens是字符串数组,System.out.printf("%s",tokens);只是打印tokens所指向的第一个成员的字符创,如果想全部打印,需要用循环。

代码调试中的问题和解决过程

  • 『问题1』:在补全8.3.1中第一个代码后,编译提示找不到符号FileInputStream。

  • 『解决方案』:查询了API,FileInputStream是java.io.InputStream的子类,所以使用前前需要import java.io.*;截图如下:

  • 『问题2』:写了TestFileUtil类测试p236 FileUtil.java编译时提示“必须对FileNotFoundException进行捕获或声明以便抛出”。截图如下:

  • 『解决方案』:在main(String[] args)后加throws FileNotFoundException结果编译通过,运行时,将readFile()中的参数设为"FileUtil"结果显示无法找到文件FileUtil。截图如下:

  • 「尝试」将参数中添加文件所在路径~/zjy20155312/src/Unit08/FileUtil但还是抛出FileNotFoundException异常,无法找到指定文件。

  • 『问题3』:补全doSome的代码片段后出现这样的编译问题:

  • 『解决方案』:添加一个class。总结:一个程序中如果没有定义class,interface,enum,只是定义了一个方法,是无法通过编译的。

代码托管

  • 代码提交过程截图:

  • 代码量截图:

上周考试错题总结

  • 『错题1』:填空:”Hello”.charAt(1) 的值是(‘e’)

    • 「原因」:理解题意有误,以为是求字符‘e’对应的整数值。
    • 「理解情况」:已理解,charAt(1)的意思是取字符串下标为1的字符(下标从0开始)。
  • 『错题2』:填空:写出编译P165 RPG.java的命令(javac –d . *.java)

    • 「原因」:以为只是编译RPG.java这个文件即可,所以我的答案是(javac -d xxx RPG.java)。
    • 「理解情况」:1.不理解为什么把生成的.class文件放到.当前文件夹下,这样指定路径还有什么意义呢?2.用*代替RPG的是因为要连带把文件中涉及到的SwordsMan.java和Magician.java两个文件一起编译了吗?解决:RPG是测试类代码,老师答案中*.java是把它和工作类代码一同翻译了。
  • 『错题3』:判断:父类中有个public void fight(),子类中有个public void fight( Weapon w),这两个方法的关系是Override.(X)

    • 「原因」:对方法的重载(Overload)和覆盖(Override)概念混淆。
    • 「理解情况」:方法重载是在一个类中使用多个同名构造函数,其间只是参数类型和个数不同;覆盖是子类对父类中定义的方法的重新描述,其方法名,参数表都需要一致。参考方法重写(OverRide)具体对比如下:
      • 相同点 : 都要求方法名称相同都可以应用于抽象方法和非抽象方法之间。
      • 不同点:
      1. 方法重载发生在同一个类的内部的方法内,而方法重写发生在继承关系中,子类重写了父类的方法;
      2. 方法重载不要求方法的返回类型一致与否 而方法重写要求返回类型必须一致,要求方法的参数签名必须不一致,而方法重写要求方法的参数签名必须一致
      3. 方法重载对方法的访问权限和抛出异常没有限制,而方法重写对方法的访问权限和抛出异常有限制
  • 『错题4』:填空:实现接口表示(拥有行为),但不是ISA关系。

    • 「原因」:对题目理解不到位,时间不够用。
    • 「理解情况」:已经理解,“拥有行为”与“是一种”关系类似,都是等号右侧“...”等号左侧。
  • 『错题5』:填空:实现一个类中的equals()方法时,一定要同时实现(hashCode())方法。

    • 「原因」:时间不够。
    • 「理解情况」:书有这样一句话“操作equals()同时也会操作hashCode()”。
  • 『错题6』:判断:Java中所有的对象都有equals()方法。(OK)

    • 「原因」:不记得自己有没有做这道题。
    • 「理解情况」:equals是Object类有定义的方法,它的源程序是return this == obj,对于Java中的所有对象,无论是基本类型还是类类型,都可以进行==比较。
  • 『错题7』:判断:XX是一个引用型变量,System.out.println(XX)等价于System.out.println(XX.toString()). (OK)

    • 「原因」:时间不够。
    • 「理解情况」:已理解。
  • 『错题8』:面向对象中,设计经验可以用(设计模式)表达。

    • 「原因」:看书不仔细,自学过程中虽然结合了教学指导,但仍不知道一部分知识是重点。
    • 「理解情况」:设计模式是可复用面向对象软件的基础。参考Java开发中的23种设计模式详解
  • 『错题9』:判断:Math中的abs()方法可以Override.(X)。

    • 「理解情况」:override 具体知识点:
      • 子类的方法名称,参数签名和返回类型必须与父类的方法名称,参数签名和返回类型一致。
      • 子类的方法不能缩小父类方法的访问权限,只能扩大不能缩小。
      • 子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须与父类相同或抛出的异常类为父类抛出异常类的子类。
      • 父类的静态方法不能被子类覆盖为非静态方法。
      • 父类的非静态方法不能被子类覆盖为静态方法。
      • 父类的非抽象方法可以被子类覆盖为抽象方法。

结对及互评

这周我对搭档的帮助主要是帮她在周三的练习题中分析代码,一起修正代码。在计算机二级的考试复习阶段相互鼓励,与她共享我的复习文档和考试经验,同时督促对方学习java。

评分标准(满分10分)

  1. 从0分加到10分为止

  2. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  3. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  4. 教材学习中的问题和解决过程, 一个问题加1分

  5. 代码调试中的问题和解决过程, 一个问题加1分

  6. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分

6 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
7 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分

点评模板:

  • 基于评分标准,我给本博客打分:(0-10)。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

其他(感悟、思考等,可选)

自我总结如下:

  1. 做题速度慢,课堂测验出现做不完题的情况。
  2. 对书本知识掌握存在片面性,对延展性知识了解不够。
  3. 学习java的最终目的是实现自动化,即会编出质量高的程序解决需求。所以夯实基础的同时提高编程能力才是重中之重。
  4. 第五周由于花费了大部分时间准备计算机二级考试,周一到周五没能做到每天学习java,在以后的学习中不会再出现这样的情况。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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 大部分自己补全的代码片段不会出现问题,渐渐具备脱离书本编代码的能力
第五周 696/1987 1/7 20/158 能够帮助其他同学发现代码出错的原因

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

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

参考资料

posted on 2017-03-26 22:04  鲸鱼的抽屉  阅读(390)  评论(6编辑  收藏  举报