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值的数组。所以,没有数组可以同时存储双精度数和字符串。
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
其他(感悟、思考等)
感悟
- 这周对继承关系有了一定的认识,但本周在第九章学习的时长是比较短一些,可能是内容比较少的原因。这周的重心是放在了实验项目上,在那上面多花了功夫。总体来说在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 | 关于继承有一定认识 |