20172303 2017-2018-2 《程序设计与数据结构》第7周学习总结

20172303 2017-2018-2 《程序设计与数据结构》第7周学习总结

教材学习内容总结

1.继承

  • 继承的过程是在两个类之间建立一种“是”的关系,即子类是一种更具体的父类版本。
  • 父类用于派生新类,又称为超类或基类。被派生出来的类称为子类或亚类。
  • Java中使用extends进行派生
    • 格式:public class 子类 extends 父类{}
  • 继承具有单向性。
  • 在UML类图中,由子类指向父类的空心箭头代表继承关系。
  • final修饰符可用于限制继承的能力。
  • protect修饰符
    • protect修饰符的作用是既能保证子类可以引用父类的方法或变量,又能保证父类的封装性。
    • 格式:protect int num1;
    • 在UML图中,pritect成员前加#来表示protect可见性
  • super引用
    • 由于构造函数不能继承,当子类想要引用父类的构造方法时,就需要super引用。
    • 格式:
      • 引用构造函数:super(变量)
      • 引用方法/实例数据:super.方法/实例数据
  • 有些对象语言允许子类有多个父类,这种情况成为多继承。

2.重写方法

  • 当子类和父类的方法名出现相同情况时,子类将重写父类的方法。但子类不能重写final方法。

3.类层次结构

  • 一个子类可以是一个或多个其他类的父类,从而可以建立起类层次结构。继承机制具有传递性。
  • Object类
    • 所有java类都直接或间接地由Object类派生,可以说,Object类是所有类的父类。
    • 其中最常用的两个方法是toString方法和equals方法,经常被子类重写。
  • 抽象类
    • 抽象类不能被实例化,在类层次结构中充当占位符。
    • 可用abstract修饰符将一个类声明为抽象类。
    • 在UML类图中,用斜体表示抽象类。
    • 不能对一个抽象方法使用final或者static修饰符。
    • 抽象类不必一定包含抽象方法。

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

  • 问题1:Words/Book/Dictionary类和Words2/Book2/Dictionary2类的区别?
  • 问题1解决方案:两个实现的功能是一样的,所以刚开始不是很明白为什么要用两种不同的代码。重新把两个对着看了一遍,首先两边的main驱动类是没有差别的,Book类中页数是直接定义了pages变量的值,而Book2类中是通过一个构造方法来设计pages变量的值。所以Dictionary类中直接引用父类就可以了,而Dictionary2类要通过super引用来引用父类的构造方法。
  • 问题2:Java修饰符的类型和区别?
  • 问题2解决方案:主要分为可见性和非可见性修饰符(又称访问修饰符和非访问修饰符)
    • 可见性修饰符分为四种:
      • public:被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
      • private:私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
      • protected:当父类和子类在同一个包中时,被声明为 protected 的变量、方法能被同一个包中的任何其他类访问;当父类和子类不在同一个包中时,子类实例可以访问其从父类继承而来的 protected 方法,而不能访问父类实例的protected方法。
      • default:在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
    • 非可见性修饰符已学的有三种:
      • static:用于声明静态变量或静态方法。
      • final:final 变量能被显式地初始化并且只能初始化一次。类中的 final 方法可以被子类继承,但是不能被子类修改。
      • abstract:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充
  • 问题3:不是很能理解P299的“每一次的派生都应该具有一种‘是’关系,子类是一种更具体的父类版本。”的含义。
  • 问题3解决方法:询问了于欣月同学,她举了一个非常形象的例子,比如说有一个马类和一个哺乳动物类,你可以很明确地说出“马是哺乳动物”这样一种“是”的关系,所以可以说哺乳动物类是马类的父类。

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

  • 问题1:做PP9.1时输出结果一直是一个结果
  • 问题1解决方案:再次询问了于欣月同学,把MonetaryCoin a = new MonetaryCoin();放到了while循环中。
    修改前:

    修改后:

    修改后正确运行结果:

    原因见下图:

代码托管

  • 本周代码量出现问题(╥╯^╰╥)周一去找王老师看了一下,老师说脚本之类的都没问题,应该是有什么文件丢失了,不影响课程进度的话就不用管了,就按着现在的代码量往上增吧

上周考试错题总结(正确为绿色,错误为红色)

  • 错题1:If a and b are both int arrays, then a = b; will
    • A . create an alias
    • B . copy all elements of b into a
    • C . copy the 0th element of b into the 0th element of
    • D . return true if each corresponding element of b is equal to each corresponding element of a (that is, a[0] is equal to b[0], a[1] is equal to b[1] and so forth) and return false otherwise
    • E . return true if a and b are aliases and return false otherwise
  • 原因及理解情况:做的时候没有搞清楚"alias"的意思,之后查了才反应过来是别名,当时觉得“=”是用来赋值的,a = b应该就是把b赋值给a,但由于a和b是数组,所以他们现在引用同一个数组,成了相互的别名。
  • 错题2:Arrays have a built in toString method that returns all of the elements in the array as one String with "\n" inserted between each element.
    • A . true
    • B . false
  • 原因及理解情况:刚开始看解析不理解为什么数组从Object类继承,看了第九章知道了因为它是所有类的父类。Object类有一个toString方法。但是,Object的toString方法不返回存储在Object中的值,而是返回参考变量的值。所以,在数组上使用的toString不会返回数组中存储的值,而是返回一组没有意义的字符。
  • 错题3A Java main method uses the parameter (String[ ] variable) so that a user can run the program and supply "command-line" parameters. Since the parameter is a String array, however, the user does not have to supply any parameters.
    • A . true
    • B . false
  • 原因及理解情况:main方法需要提供参数。例如老师上课举得一个例子:

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • 优点:教材内容学习相比上周有改进,感觉开始认真看教材了。适当的一些表情确实能增加博客的可读性。
    • 问题:张昊然同学说自己本周问题不多,但我觉得是否有可能是在看教材时还是不够深入,没有多考虑一些问题,只是泛泛地把课本看过去了。
  • 代码中值得学习的或问题:
    • 优点:在本周有实验课后把代码分开文件夹放,更加简洁整齐,是我应该学习的。
    • 问题:commit提交可以再简洁并且具体一些。

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172322
    • 结对学习内容
      • 张昊然同学教会了我如何画UML类图并帮助我完成了实验2的节点四。
      • 讨论PP9.1,两人都出现了最后输出结果不变的问题,最后通过询问别组的于欣月同学解决的。

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

  • 这周的内容相比前几周要简单许多,感觉能稍微放松一点点。这周在写博客的时候最大的感触就是你学的东西多了,就有很多可以类比总结的概念,就像初高中历史老师按时间顺序讲完知识后,会在期末时按不同的专题进行讲解,这样就能综合一学期所学的全部内容。我希望在接下来的每一次博客中我都能总结点什么东西。
  • 教材复习情况
    • 复习进度(页数):71/310
    • 重要成长:
      • 复习了四种整形和两种浮点型。Java中默认所有整型值为int型,最后加L或l才是long型。
      • 复习了ASCII码和Unicode码的差别。
      • 之前一直不知道怎么写的布尔变量类会写了(〃'▽'〃)
      • 在P56的Scanner类方法中找到了之前一直搞不清hasNext方法是干嘛的
    • 感想:这周复习的页数不是很多,但感觉收获很大,觉得java的知识体系渐渐清晰了。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 120/120 1/1 9/9
第二周 246/366 1/2 9/18
第三周 785/1121 2/4 15/33
第四周 615/1736 1/5 20/53
第五周 1409/2645 1/6 24/77
第六周 561/3206 1/7 20/97 再次搞清了一些自己有点含糊不清的概念
第七周 63/3269 1/8 15/112
  • 计划学习时间:15小时
  • 实际学习时间:15小时
  • 改进情况:本周学习内容不是很难,再加上其他科目事情比较多,分给java的时间可能有点少,下周会改进。

参考资料

posted @ 2018-04-22 22:23  框框框  阅读(186)  评论(4编辑  收藏  举报