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


2018年学习总结博客总目录:[第一周](http://www.cnblogs.com/hzy0628/p/8539037.html) [第二周](http://www.cnblogs.com/hzy0628/p/8584976.html) [第三周](http://www.cnblogs.com/hzy0628/p/8642935.html) [第四周](http://www.cnblogs.com/hzy0628/p/8671888.html) [第五周](http://www.cnblogs.com/hzy0628/p/8746606.html) [第六周](http://www.cnblogs.com/hzy0628/p/8830819.html) [第七周](http://www.cnblogs.com/hzy0628/p/8870071.html)

教材学习内容总结

1.创建子类:用于派生新类的原始类称作父类、超类或基类,被派生出的类称为子类或亚类。Java中用保留字extends来指明新类由已有类派生而得。继承的过程是在两个类之间建立一种“是”的关系,即子类是一种更具体的父类版本。这是一个继承的表述:public class Dictionary extends Book,说明的是Dictionary类是由Book类派生而得来的。

2.继承具有单向性,父类不能引用子类内部声明的变量和方法。

3.protected修饰符:我们之前已经学过public和private两种可见性修饰符,下面介绍protected修饰符。可见性修饰符用于控制对类成员的访问,这种控制也延伸到继承过程中。父类的公有方法或变量子类可是访问调用,而私有方法或变量则不能。于是引入protected修饰符,父类中方法或变量声明为protected可见性时,子类可以引用它,同时也可被一个包内其他类所引用。

4.继承过程中构造函数并不会被继承,这时我们可以使用一个保留字super引用父类,super的用处之一是可以调用父类的构造方法。super用法注意:用super引用调用父类构造方法的操作只能在子类中执行,并且必须是第一行,如果没有这样的调用,Java会自动在构造方法开始处产生一行super(),以确保父类构造方法初始化自己变量。下面是一个举例:

public Dictionary2(int numpages, int numDefinitions)
    {
        super(numpages);
        definitions = numDefinitions;
    }

5.多继承:多继承有时效果会很好,但存在一些问题,如两个父类中有重名方法时应该怎么处理?所以呢,Java语言明确表明不支持多继承,但Java中支持实现多接口,可以完成类交互。

6.(1)重写方法:子类和父类具有相同方法名和签名时,子类方法将重写父类方法,子类方法优先。但子类不能重写父类中的final方法。(2)影子变量:子类中与父类具有相同的变量,子类中声明的同名变量被称作影子变量(shadow variable),原则上我们要避免使用影子变量,因其容易造成混淆。

7.类层次结构:同一个父类派生出的多个子类,称为同胞。一个类的子类还可以称为一个或多个其他类的父类,由此建立起类层次结构。

8.Java中,所有类归根结底都是由Object类派生而来的,Object类是Java继承树的根节点。如果一个类没有extends子句显式派生,则自动从Object类派生。一个类中定义toString方法时,实际上是重写了Object类中的toString方法,从而实现返回自己保存的字符串。

9.抽象类:抽象类可以包含抽象方法,,也可以声明数据。在类定义声明头中,可用abstract修饰符将一个类声明为抽象类,包含抽象方法的类必须声明为抽象类,抽象方法必须用abstract修饰符,但抽象类不一定包含抽象方法。

10.对于一个抽象方法不应该使用final或static修饰符修饰,因为子类不能重写final方法,一次无法为抽象final方法提供定义。static方法可以由类名进行调用,而不必实例化对象类调用,由于抽象方法没哟实现代码,抽象static方法没有意义。

11.同时接口也可以进行派生,同类的继承相似,但不存在(protected 和private成员)可见性问题,因为一个接口的所有成员都是公共的。要注意类不能用于派生接口。

12.父类中的私有成员也被子类继承,只是不能以成员名进行访问,但是可以通过某个公共的方法进行间接的访问,如书上的【例9.10、9.11、9.12】,这里不再列举。

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

  • 问题1:关于书上所说的super的使用方法,书上值提到一种,且说它类似于this引用,我们学过this引用是用于引用当前正在运行的对象,那么两者到底有什么区别,同时super还可以用来做什么?

  • 问题1解决方案:从博客园的一篇博客中找到了我想要的一个答案,见下图:

他这篇博客还较完整的解释这些关系。让我比较清楚的了解到super的用法及与this的区别。同时我从书上的一道例题中又看到了super的一种用法:调用子类中重写方法的父类版本。

  • 问题2:SR9.9的b小题:子类可以重写父类中的构造方法。错误。 关于这个错误的原因我不明白,我选的也是正确。

  • 问题2解决方案:通过查答案,找到了解释:因为构造方法是一种特殊的方法,与类名相同,但没有返回类型,如果试图重写父类的构造方法,将产生语法错误。还是不太明白,这个答案在解释什么...,从网上找了一些,看完这个理解一些,就是默认就会去调用父类无参构造,没有被重写的可能。

子类不能重写父类的构造函数,子类在构造函数中就会首先去调用父类的构造,默认调用的是父类的无参构造。如果你需要参数个数不同的构造,可以在父类中写多个构造方法的。子类继承父类的方法中不包含构造方法。

  • 后补:上课结合蓝墨云课件,以及老师所讲,对这里有了更深的一些认识,见下图:

  • 问题3:SR9.22中,为什么子类必须要重写其父类的中的toString方法,即便是在当前的程序中该方法并没有被子类所调用?

  • 问题3解决方案:以前也是遇到过没有重写的话,会产生的是对象的地址,那这里没有使用或继承子类时也要重写真的是因为答案所说:以避免后面出现问题,因为以后可能有人在直接使用该子类时或继承该子类时,会认为该子类已经存在一个有效的toString方法。

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

  • 问题1:本章中学习代码调试中并没有遇到太大问题,编程项目也是完成比较顺利一些,一开始有些问题的就是PP9.3的题意,它给出的要求是设计并实现一组类。

  • 问题1解决方案:想了之后的感觉是应该先编写一个父类,然后再去由这一个父类派生出这一组类,这应该是题目的意思,但是这个toString方法到底是在父类中编写还写子类中编写,这个搞不清楚,又看了半天题目,可能是题目中要求的是每个子类还要有其他属性,如果在父类中重写了toString方法,在子类中还要重写,就没有在父类中重写这个toString方法。下面是写出的那个父类。

public class Readings
{
    protected int pages;
    protected String antisop;

    public Readings(int pages,String antisop)
    {
        this.pages = pages;
        this.antisop = antisop;
    }

    public void setPages(int numpages)
    {
        pages = numpages;
    }
    public void setAntisop(String antisop)
    {
        this.antisop = antisop;
    }

    public int getPages(int numpages)
    {
        pages = numpages;
        return pages;
    }
    public String getAntisop(String antisop)
    {
        this.antisop = antisop;
        return  antisop;
    }

}
  • 问题2:这周完成了上周并不会做的项目8.6,在这个项目的编写中也遇到些问题,上周博客没有补充,在这里写一下,这里呢,首先是那个基础的Account类,然后就是一个Tranctions类,在这个类中定义了一个数组,然后是实现这个transactions类的程序,但是在这个程序中我们创建了一个transactions对象,Transactions accts = new Transactions();,但是这个对象已经不能再使用Account类中存钱取钱操作,这个怎么解决?

  • 问题2解决方案:这个想了好久,也是一直卡着,最后是看了一下别的同学的码云代码,就是在transactions类中我们可以新定义方法完成存钱和取钱的操作,见如下的代码:

public double acctdeposit(int number,double amount)
      {
          double acctbalance = acct[number].deposit(amount);
          return  acctbalance;
      }
      public double acctwithdraw(int number,double amount,double fee)
      {
          double acctbanlance = acct[number].withdraw(amount,fee);
          return acctbanlance;
      }

这样就可以在程序中使用这个方法完成存钱和取钱的操作。

代码托管

  • 本周是打算用IDEA进行统计代码的,但在IDEA 中统计结果与虚拟机上差距较大,这周先以虚拟机中代码行数为准,下周会删掉一些之前项目,以后使用IDEA进行统计。

上周考试错题总结

  • 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

  • 解析:在Java中,数组被作为对象来实现。该变量是储存整个数组的内存块的参考变量。然而,使用符号名称索引而不是通过消息传递来访问数组。

  • 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

  • 解析:数组被初始化为int [] array = new int [a],其中a是数组的大小。但这个数组的索引值为0到a - 1,有时程序员会编写代码来尝试访问索引1到a。这就导致了差一错误。

  • 3.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?
    A . (int[ ])
    B . (int a[ ])
    C . (int[ ] a)
    D . (int a)
    E . (a[ ])

  • 解析:这道题被误导了,误以为数组作为参数传递与定义一个数组不同,但实际上是一致的,参数被定义为变量最初声明为类型参数名称。这里,类型是int,参数是a。

  • 4.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都引用同一个数组,所以他们现在为彼此的别名。

  • 5.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

  • 解析:main方法需要参数,以防程序员希望允许用户提供命令行参数。在Java命令之后,在命令行输入的任何东西都将被接受为命令行参数。如果是由空格分隔的几个单词,那么每个单词都存储为一个单独的字符串数组元素。例如,“java foo,这里的类hi“会在变量0中存储”hi“在变量1中”,以供程序使用。

  • 6.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.
    A . true
    B . false

  • 解析:数组被称为同构类型。这意味着存储在阵列中的值的类型必须对每个元素都是相同的。类型由声明决定。所以,int x只让x成为int值的数组。所以,没有数组可以同时存储双精度数和字符串。

结对及互评

点评过的同学博客和代码

  • 本周结对学习情况
    • 20172308

    • 博客中值得学习的或问题:上周提出博客排版的问题后马上做出了改观,同时这周的博客内容也是比较充实,问题中有些也问过我,我也不是很明白,看他的博客也对那些问题有了一个理解,并且博客交的也是比较早。

    • 结对学习内容
      共同学习了第九章的学习内容,并且就他的博客中问题2进行讨论过,无果,但是本身的话自己没有那么想。

    • 上周博客互评情况

    • 20172308

其他(感悟、思考等)

感悟

  • 这周对继承关系有了一定的认识,但本周在第九章学习的时长是比较短一些,可能是内容比较少的原因。这周的重心是放在了实验项目上,在那上面多花了功夫。总体来说在Java上这周花的时间可能稍微少了一些,实验项目有的做着很吃力,做不下去,有些学不进去。下周希望能多投入一点!

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 157/157 1/1 15/15
第二周 382/539 1/2 16/31
第三周 317/856 2/4 15/46
第四周 996/1852 1/5 24/70
第五周 578/2330 1/6 16/86 这周对上周第七章的学习有了更深的理解
第六周 475/2805 1/7 14/100 学习了数组方面的相关知识
第七周 629/3434 1/8 14/114 关于继承有一定认识

参考资料

posted @ 2018-04-21 15:27  ◕‿◕  阅读(405)  评论(9编辑  收藏  举报
© 2018 GitHub, Inc.