20172328《程序设计与数据结构》第七周学习总结

学号20172328《程序设计与数据结构》第七周学习总结

第九章教材学习内容总结

  • 1.继承的概念:
    • 继承是在父类和子类之间建立一种“是”的关系。
    • 用于派生新类的原始类称为父类、超类或基类,被派生出的类就称为子类或者亚类。
  • 2.继承具有单向性。java中用extends来表示新类由现有类派生。
  • 3.protected修饰符:当变量声明为protected可见性时,子类就可以引用它,并且使父类保持了一定的封装性。
    (在UML图中,用#表示protected可见性。)
  • 4.super引用,使用super引用可以访问父类的成员。子类构造方法负责调用父类构造方法,而且应该在子类的构造方法的第一行用super()引用调用父类构造方法。
  • 5.java的继承方法为单继承,即子类只能有唯一的父类。在java中可以依赖接口实现多继承,
  • 6.重写方法:即子类和父类里面有相同的方法和签名时,子类方法可以重写父类方法,子类方法优先。调用方法的对象决定决定了哪一个版本的方法将被实际执行。
  • 7.影子变量:如果在一个子类中声明一个同名变量,则该变量称为影子变量。
  • 8.类层次结构:继承关系通常发展成一个类层次结构。在类层次结构中,应当重视合理将类的公共特征保持在尽可能高的层级上。
  • 9.所有的类都是直接或者间接由object类派生。object类定义在Java标准类库的java.lang包中。
  • 10.final修饰符可以限制继承的能力。用final修饰符声明方法,使得该方法在任何派生类中不能被重写。

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

  • 问题1:变量声明为protected可见性的封装性不如private可见性严格,但比public可见性很强。

  • 1.(〃'▽'〃)本题解答:

    • public:具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。

    • protected:主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西

    • default:有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。

    • private:访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。

  • 问题2:类的派生代表什么关系?

  • 2.(〃'▽'〃)本题解答:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力,是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

  • 问题3:抽象类和接口的区别?

  • 3.(〃'▽'〃)本题解答:abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换。

抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。抽象类要被子类继承,接口要被类实现。接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现。接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。抽象类里可以没有抽象方法。如果一个类里有抽象方法,那么这个类只能是抽象类。抽象方法要被实现,所以不能是静态的,也不能是私有的。接口可继承接口,并可多继承接口,但类只能单方面继承。

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

  • 问题1:在做pp9.1时出现错误提示,标明int型不能被应用,但是之前父类MonetaryCoin中我设置面值类型是int类,将其相加之后毋庸置疑还应该是int型,所以很不解。
      
      
      

  • 1.(〃'▽'〃)本题解答:和伙伴郭恺讨论之后,他告诉我父类中faceValue初始化有错误,并且我创建的CoinMonetary的对象one数组不能直接相加等于int型变量Sum。因此,错误出在了没有认真将对象和方法辨别清楚。

  • 问题2:同样是在做pp9.1时,自己想使用父类Coin中的随机数掷硬币方法filp并让其顺序输出,当时想到用for-each来做,但是好像思路不正确,也做不出来。

  • 2.(〃'▽'〃)本题解答:结对小组超级好用,随即求助大佬。问题迎刃而解,并且还小小的学习了一下for循环和for-each循环的区别。for-each循环
    我们经过讨论(其实是我在听讲),用了两种方法来输出Coin类的filp方法,并将其全部输出。

代码托管(statistics.sh脚本的运行结果截图)

  

上周考试错题总结

  • 问题1: In Java, arrays are(在java中,数组是)
    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(字符串)
  • 问题1分析和领悟:选择B,在Java中,数组被实现为对象。变量是存储整个数组的内存块的引用变量。
  • 问题2:If an int array is passed as a parameter to a method, which of the following would adequately define the parameter list for the method header?(如果一个int数组作为参数传递给方法,下面哪个选项可以为方法头定义参数列表?)
    A . (int[ ])
    B . (int a[ ])
    C . (int[ ] a)
    D . (int a)
    E . (a[ ])
  • 问题2分析和领悟:选择C,参数被定义为变量最初被声明为类型参数名称。这里,类型为int[],参数为a。当时我觉得B、C一样都可以声明数组,没有好好考虑直接排除了。
  • 问题3:Assume that BankAccount is a predefined class and that the declaration BankAccount[ ] firstEmpireBank; has already been performed. Then the following instruction reserves memory space for
    firstEmpireBank = new BankAccount[1000];(假设BankAccount是一个预定义的类,并且该声明BankAccount[] firstrebank;已经被执行。然后,下面的指令存储内存空间。)
    A . a reference variable to the memory that stores all 1000 BankAccount entries(存储所有1000个BankAccount条目的内存的引用变量。)
    B . 1000 reference variables, each of which point to a single BankAccount entry(1000个参考变量,每个变量指向一个银行帐户条目。)
    C . a single BankAccount entry(一个BankAccount条目)
    D . 1000 BankAccount entries(1000个BankAccount条目)
    E . 1000 reference variables and 1000 BankAccount entries(1000个参考变量和1000个BankAccount条目)
  • 问题3分析和领悟:第一次银行帐户;为firstentity银行保留内存空间,它本身是指向BankAccount[]对象的引用变量。实例化BankAccount[]对象为1000个BankAccount对象。语句保留了1000个引用变量的内存空间。请注意,这1000个银行中没有一个对象。
  • 问题4:Given the following declarations, which of the following variables are arrays?(给定以下声明,下列哪个变量是数组?)
    int[]a、b;
    int c,d[];
    A . a
    B . a and b
    C . a and d
    D . a, b and d
    E . a, b, c and d
  • 问题4分析和领悟:选择D,第一个声明声明a和b都是int数组。第二个声明声明c和d是int型,但d是一个int数组,c是变量。a b和d都是int数组。
  • 问题5:If a and b are both int arrays, then a = b; will(如果a和b都是int数组,那么a = b;将)
    A . create an alias(创建一个别名)
    B . copy all elements of b into a(将b的所有元素复制到a中)
    C . copy the 0th element of b into the 0th element of a(把b的第0个元素复制到a的第0个元素中。)
    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(如果b的每个对应元素都等于a的对应元素(即a[0] = b[0], a[1] = b[1]等),则返回true,否则返回false)
    E . return true if a and b are aliases and return false otherwise(如果A 和B 是数组就返回ture,否则返回false)
  • 问题5分析和领悟:选择A,“=”是一个赋值运算符。如果两个变量都是原语,比左边的变量副本右边变量(如果a和b是int值,b = 5,然后将成为5)。然而,因为a和b是数组的引用变量设置为参考变量b,导致a和b都引用同一个数组在内存中,或者他们现在彼此的别名。
  • 问题6: 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.(Java主方法使用参数(String[] variable),以便用户可以运行程序并提供“命令行”参数。由于参数是一个字符串数组,因此用户不必提供任何参数。)
    A.True
    B.Flase
  • 问题6分析和领悟: 主方法需要参数,以防程序员希望允许用户提供命令行参数。在java命令之后,在命令行输入的任何内容都将被接受为命令行参数。如果是由空格分隔的几个单词,那么每个单词都作为一个单独的字符串数组元素存储。
  • 问题7:In Java, an array can only store one type of data. For instance, you cannot create an array that stores both double and String values.(在java中,一个数组只能储存一种类型的数据,举个例子,你不能将浮点型和字符串型放一起。)
  • 问题7分析和领悟:选择true, 数组被称为同构类型。这意味着存储在数组中的值的类型必须与每个元素相同。类型由声明决定。因此,int[] x只使x为int值的数组。因此,没有数组可以同时存储double型和String型。
  • 问题8: So long as one is only accessing the elements of an ArrayList, its efficiency is about the same as that of an array. It's only when one begins to insert or remove elements towards the front portion of an ArrayList that its efficiency deteriorates.(只要只访问ArrayList的元素,它的效率与数组的效率差不多。只有当一个人开始在ArrayList的前部分插入或移除元素时,它的效率才会变差)
  • 问题8分析和领悟:选择Ture,ArrayList是作为数组实现的,只要其中一个只是访问ArrayList的元素,效率与数组的效率是一样的。但是,当对ArrayList的前部分进行插入或删除时,就会发生大量的元素复制,从而降低其效率。

结对及互评

-20172301
-20172304

点评模板:

  • 博客中值得学习的或问题:
    • 20172301:博客内容丰富多彩,很明确的点出了本章学习的难点和易混点,很容易让人把握重点知识,参考资料很多,博客内容很充分。如果说还有点美中不足的话,就是错题的改正比较简短,虽然我也很简短哈哈,下次可以一起充实一下错题学习内容。
    • 20172304:博客内容妙趣横生,可读性强。内容有点单薄,希望可以增加一点,更加完善一点。
  • 代码中值得学习的或问题:
    代码中值得学习的地方很多。简要分析就是一个类或者测试程序结构的细节完整性,方法应用的熟练性,多种示例编写的快速简洁性。

点评过的同学博客和代码

  • 本周结对学习情况
    -20172301
    -20172304
    • 结对学习内容
      • 通过练习pp9.1了解到数组对象和方法之间的区别。
      • 学习了如何在类中写toString方法。
      • 讨论了方法重载和方法重写的区别。
      • 一起学习了for循环和for-each循环的区别和基础用法。
  • 上周博客互评情况

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

继承是我们在学习第七章(7.4)时若隐若现出现的内容,当时没有去思考、去感悟、只简单层次的了解了类之间的调用和聚合关系;其实在学习过程中遗忘的还是蛮快的,这周的心得就是在向前走的时候也回头看看,不让自己丢太多,也让自己融会贯通新知与旧识。In conclusion:I have nothing to offer but blood ,toil,tears and sweat.

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 100/100 1/1 15/15
第二周 377/477 1/2 20/35
第三周 280/757 2/4 22/57
第四周 973/1730 1/5 35/92
第五周 1000/2730 1/6 40/132
第六周 729 /3459 1/7 40/172
第七周 660/4119 2/9 30/192

参考资料

posted @ 2018-04-22 08:59  虹澄清晓  阅读(420)  评论(9编辑  收藏  举报
页尾