王彪20162321 2016-2017-2 《程序设计与数据结构》第7周学习总结
学号20162321 2016-2017-2 《程序设计与数据结构》第七周学习总结
教材学习内容总结
-
关键概念
- 多态引用在不同的时候可以指向不同类型的对象
- 多态引用在运行时才将方法调用与它的定义绑定在一起
- 引用变量可以指向声明继承于它的任意类的任何对象
- 对象的类型,而不是引用的类型,决定调用的是方法的哪个版本
- 接口是一组抽象方法,所以不能被实例化
- 继承可适用于接口,所以一个接口可派生于另一个接口
- 接口引用可以指向实现这个接口的任意类的任何对象
- 方法的参数可以是多态的,这样使方法具备了对其参数进行控制的灵活性
- 在侦听器和所侦听组件之间建立关系是通过多态完成的
-
重点总结
- 当一个类给出了接口中定义的每个抽象方法的实现是,就称类实现了接口
- 如果接口中的某个方法没在类中实现,则编译错误
- 接口只保证类实现了某些方法,但它不限制类可以有其他的行为
- 多个类可以实现同一个接口,并在类中提供它们各自对方法的定义
- 接口中还可以包含常量,这些常量用final修饰符来定义
- 子接口继承父接口中的所有抽象方法和常量。实现子接口的任何一个类必须实现所有的方法
- 接口中所有成员都是公有的
教材学习中的问题和解决过程
- 问题1:如何理解书中
对象的类型,而不是引用的类型,决定调用的是方法的那个版本
-
解决思路:当一个父类对象的引用变量,它引用子类对象时,决定调用谁的成员方法的条件是:被引用对象的类型而不是引用变量的类型。但是这个被调用的方法必须是在父类中定义过,也就是子类覆盖过的方法。
-
问题2:关于动态绑定
1.关于绑定
绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.
2.静态(前期)和动态(后期)绑定
静态:在程序执行前方法已经被绑定,java当中的方法只有final,static,private和构造方法是前期绑定。(个人认为将方法声明为final既是为了方法被覆盖也是为了关闭动态绑定,static,private由于不能被继承所以在编译时就可以确定值)
动态:在运行时根据具体对象的类型进行绑定。
3.动态绑定的细节(来自网络)
- 编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法,并且x已经被声明为C类的对象,那么编译器会列举出C类中所有的名称为f的方法和从C类的超类继承过来的f方法
- 接下来编译器检查方法调用中提供的参数类型。如果在所有名称为f 的方法中有一个参数类型和调用提供的参数类型最为匹配,那么就调用这个方法,这个过程叫做“重载解析”
- 当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型相匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f(String)那么该方法被调用,否则就在D的超类中搜寻方法f(String),依次类推
4.我的例子
public class Testme {
public static void main(String[] args){
Father people = new Son();
people.high();
}}
class Father{
public void high(){
System.out.println("170");}}
class Son extends Father{
public void high(){
System.out.println("120");}}
声明了Father类型变量people但它指向是一个Son的对象,其调用Son的方法,因为在运行时发生了动态绑定,在绑定过程中需要确定调用哪个版本的high方法实现。
- 问题3:关于接口的继承问题
- 描述:书中介绍继承的概念出适用于类外,还适用于接口,那么接口继承是否和类继承一般不支持多继承。
(来自网络)java接口可以多继承。
Interface Extends Interface0, Interface1, interface3
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。
代码调试中的问题和解决过程
- 问题1:static关键字
- 描述:在做实验时有如下代码
public class Mydoc {
Document d;
public static void main(String[] args) {
d = new Document(new IntFactory());
d.DisplayData();
d = new Document(new FloatFactory());
d.DisplayData();
}
}
此时程序提示Non-static filed 'd' cannot be referenced from a static context
- 解决过程:因为静态方法不会对具体的对象进行操作,所以它们不能引用只在类的实例中才存在的实例变量。所有的静态方法,包括main方法,都只能访问静态变量或局部变量。
所以static Document d
代码托管
- 代码截图
上周考试错题总结
- 1.如果有以下的程序代码:
Int x=100;
Int y=100;
Integer wx=x;
Integer wy=y;
System.out.println(x==y);
System.out.println(wx==wy);
在JDK5以上的环境编译与执行,则显示的结果是[true,true]
- 1.分析:不了解Integer类
Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。
此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。
- 2.如果有以下的程序代码:
int[] arr1 = {1, 2, 3};
int[] arr2 = new int[arr1.length];
arr2 = arr1;
for(int value : arr2) {
System.out.printf("%d", value);
}
以下描述何者正确? [执行时显示:123]
- 分析;fot-each语句,等价于下列语句
int value
while(arr2.hasNext()){
myBook = bookList.next();
System.out.println(value);}
结对及互评
- 本周结对学习情况
- 20162327
- 结对学习内容
- Complex复数类
- Junit单元测试
- 删除数组元素
- 上周博客互评情况
其他(感悟、思考等,可选)
- 转瞬间书本已经过半了,知识还很散,需要一次总结。
- 这周的实验介绍了Junit进行单元测试,但对于编写好的测试代码还有很大很大的不足。
- 课外的知识汲取很有必要,没事可以多看看别人的博客,交流经验
- 多看课外书,这周的读书让我感受很多,收获很多
第二次试验Java面向对象程序设计
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第五周 | 200/1500 | 2/6 | 20/20 | |
第六周 | 200/1700 | 1/7 | 18/38 | |
第七周 | 500/2100 | 2/9 | 20/58 | |
第八周 | 000/0000 | 0/0 | 00/00 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)