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

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

教材学习内容总结

  • 创建子类
    • 继承在父类和子类之间建立一种“是”关系(保留字extends),继承具有单向性。
    • protected可见提供了允许继承的最大可能的封装性,但构造方法不会继承。
    • 使用super引用可以调用父类的构造方法,super引用调用父类构造方法的操作只能在子类中执行,并且必须是在第一行执行。
    • java的继承方法为单继承。接口可以继承多个接口。
  • 重写方法
    • 子类方法优先(由final修饰定义一个方法子类不能重写)
    • 影子变量——子类可以定义与父类同名的变量,重新声明可以改变变量类型,但通常应该避免使用。
  • 类层差结构
    • 一个子类可以是一个或多个其他类的父类,从而可以建立起类层次结构。继承机制具有传递性。
    • object类:所有Java类都直接或间接地由object类派生。(Java的每一个类都继承toString和equals方法)
    • 抽象类:抽象类不能被实例化(包含一个或多个抽象方法的类必须被声明为 抽象类),每一个抽象方法必须使用abstract修饰符。
    • 在UML类图中,用斜体表示抽象类。
    • 接口层次结构:继承的概念可以应用到接口,以便由一个接口派生另一个接口。
    • 类的继承与接口的继承不能重叠,即接口不能用于派生新类,类不能用于派生接口。
    • 仅当一个类设计为实现一个接口时,这个实现类和接口之间才有交互。
  • 可见性
    • 父类的私有成员也被子类继承,虽不能以成员名直接地访问这些私有成员,但可以间接地访问。
  • 类间继承关系地设计
    • 软件设计中必须特别精心地研究和设计类间继承关系地参差结构。
    • final方法常用于保证该方法能在所有的子类中得到使用。
    • final修饰符也可以作用于整个类。final类不能再用于派生新类。

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

  • 问题1:super引用的意义和用法
  • 问题1解决方案:
    • super出现在继承了父类的子类中,有三种存在方式:

      • 第一种:super.xxx(xxx为变量名或对象名)
        这种方法意义为,获取父类中的名字为xxx的变量或方法引用。
        使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作
      • 第二种
        super.xxx()(xxx为方法名)
        这种方法意义为,直接访问并调用父类中的方法。
      • 第三种
        super()这种方法意义为,调用父类的初始化方法,其实就是调用父类中的public xxx()方法;

  • 问题2:抽象类和接口
  • 问题2解决方案:
    • 如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类。比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗、猫来对它进行特定的描述,我们才知道它长成啥样。
    • 接口是一种比抽象类更加抽象的“类”。这里给“类”加引号是我找不到更好的词来表示,但是我们要明确一点就是,接口本身就不是类,从我们不能实例化一个接口就可以看出。如new Runnable();肯定是错误的,我们只能new它的实现类。

  • 问题3:几种可见性修饰符的差别(public、默认、private、protected)
  • 问题3解决方案:
    • public:被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
    • private:私有访问修饰符是最严格的访问级别,所以被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。
    • protected:当父类和子类在同一个包中时,被声明为 protected 的变量、方法能被同一个包中的任何其他类访问;当父类和子类不在同一个包中时,子类实例可以访问其从父类继承而来的 protected 方法,而不能访问父类实例的protected方法。
    • 默认:在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

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

  • 问题1:抛硬币输出的和0000,这就很奇怪了,为什么会刚好全是0,而且这不是和啊。

  • 问题1解决方案:在父类里面设置抛硬币的时候有点问题,导致抛到0的概率是100%,然后把 System.out.println("四个硬币的和为" + myCoin1.getF() + myCoin2.getF() + myCoin3.getF() + myCoin4.getF()) 改成 System.out.println("四个硬币的和为" + (myCoin1.getF() + myCoin2.getF() + myCoin3.getF() + myCoin4.getF())) 就把字符串的拼接变成相加了。

  • 问题2:做pp9.3的时候,前几个子类都没有什么问题,但是与父类相比都是增加的String变量,最后一个我想增加一个int变量,然后就出现了问题super(xxx)时候一直有问题。

  • 问题2解决方案:找出好几个错误之后还是有问题,最后我改变了一下 super()里面几个的顺序才成功了。

代码托管

上周考试错题总结

  • 错题1及原因,理解情况
    In Java, arrays are
    A . primitive data types
    B . objects
    C . interfaces
    D . primitive data types if the type stored in the array is a primitive data type and objects if the type stored in the array is an object
    E . Strings
    正确答案: B 错误答案: D
    在java中,数组是作为对象实现的。变量是存储整个数组的内存块的引用变量。但是,数组是使用符号名[index]访问的,而不是通过消息传递访问的。

  • 错题2及原因,理解情况
    The "off-by-one" error associated with arrays arises because
    A . the first array index is 0 and programmers may start at index 1, or may use a loop that goes one index too far
    B . the last array index is at length + 1 and loops may only iterate to length, missing one
    C . the last array element ends at length - 1 and loops may go one too far
    D . programmers write a loop that goes from 0 to length - 1 whereas the array actually goes from 1 to length
    E . none of the above, the "off-by-one" error has nothing to do with arrays
    正确答案: A 错误答案: B
    该数组初始化为[x],其中X是数组的大小。但是,数组的合法索引为0到X-1,所以程序员经常off-by-one,因为程序员会编写代码来尝试访问索引1到X。

  • 错题3及原因,理解情况
    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 a
    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
    正确答案: A 错误答案: B
    "="是赋值运算符。如果这两个变量是基元,则比左方变量得到一个右方变量的副本(所以如果a和B是INT值而B=5,那么a就会变成5)。但是,由于a和B是数组,引用变量a被设置为引用变量B,导致a和B同时引用内存中的同一数组,或者它们现在是彼此的别名。

  • 错题4及原因,理解情况
    A 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
    正确答案: A 错误答案: B
    当程序员希望允许用户提供命令行参数时,主方法需要参数。在Java命令之后在命令行输入的任何内容都将被接受为命令行参数。如果它是由空格分隔的几个单词,那么每个单词将被存储为一个单独的字符串数组元素。例如,“Java foo.class Hi there”将“Hi”存储在变量[0]中,“there”存储在变量[1]中,以备程序可能使用。

  • 错题5及原因,理解情况
    Although methods may be declared with a variable length parameter list, class constructors cannot.
    A . true
    B . false
    正确答案: B 错误答案: A
    构造函数遵循与通常方法相同的规则,它们的参数列表是如何声明的,因此它们也可以支持可变长度参数列表。

结对及互评

点评模板:

  • 博客中值得学习的或问题:

    • 优点:每周重要成长记录很详细,在错题总结中有自己的实践。
    • 问题:博客排版还需加强,尤其是图片的摆放。从问题总结中感觉对课本知识的挖掘不是很深入。教材内容总结还可以更详细一点。
  • 代码中值得学习的或问题:

    • commit提交的解释详细一些,但是意思的表达上和我实际差不多,我觉得我可以学习,以节约时间。
    • 本周的课本上的代码和实验的代码并没有分开文件夹放置,今后找代码时可能存在些许困难,建议她分开放置。
  • 基于评分标准,基于评分标准,我给本博客打分:14 。
    得分情况如下:

  1. 正确使用Markdown语法(加1分)
  2. 模板中的要素齐全(加1分)
  3. 教材学习中的问题和解决过程, 加4分
  4. 代码调试中的问题和解决过程, 加4分
  5. 本周有效代码超过300分行,加2分
    6 其他加分,加2分
  • 排版精美的加一分
  • 进度条中记录学习时间与改进情况的加1分

点评过的同学博客和代码

  • 本周结对学习情况

    • 20172324
    • 结对学习内容
      • 讨论了各种遇到的问题
      • 互相学习指正评论了博客
      • 通过练习pp9.1了解到数组对象和方法之间的区别
  • 上周博客互评情况

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

难啊,真的难啊,生活真的很艰辛呢,但是,学习Java任重而道远,我最喜欢学习Java了,我最喜欢Java了,最喜欢了,喜欢。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 189/189 1/1 18/18
第二周 250/439 2/3 21/39
第三周 437/876 2/5 25/64
第四周 459/1335 2/7 21/85
第五周 547/1882 1/8 20/115
第六周 592/2474 2/10 25/150
第七周 782/3256 1/11 29/179

参考资料

posted @ 2018-04-22 21:03  N-idhogg  阅读(309)  评论(2编辑  收藏  举报