目录
学号20182323 2019-2020-1 《数据结构与面向对象程序设计》第6周学习总结
教材学习内容总结
第9章
- 关键概念
-
多态引用在不同的时候可以指向不同类型的对象
-
多态引用在运行时才将方法调用与它的定义绑定在一起
-
引用变量可以指向声明继承于它的任意类的任何对象
-
对象的类型,而不是引用的类型,决定调用的是方法的哪个版本
-
接口是一组抽象方法,所以不能被实例化
-
继承可适用于接口,所以一个接口可派生于另一个接口
-
接口引用可以指向实现这个接口的任意类的任何对象
-
方法的参数可以是多态的,这样使方法具备了对其参数进行控制的灵活性
-
在侦听器和所侦听组件之间建立关系是通过多态完成的
- 重点总结
-
当一个类给出了接口中定义的每个抽象方法的实现是,就称类实现了接口
-
如果接口中的某个方法没在类中实现,则编译错误
-
接口只保证类实现了某些方法,但它不限制类可以有其他的行为
-
多个类可以实现同一个接口,并在类中提供它们各自对方法的定义
-
接口中还可以包含常量,这些常量用final修饰符来定义
-
子接口继承父接口中的所有抽象方法和常量。实现子接口的任何一个类必须实现所有的方法
-
接口中所有成员都是公有的
第十章
- 关键概念
-
错误和异常代表不常见的或不正确处理的对象
-
抛出异常时输出的消息提供了方法调用栈的轨迹
-
每个catch子句处理try块中可能抛出的一种特定类型的异常
-
不论是正常退出try块,还是因抛出一个异常而退出,都要执行finally子句
-
如果没有在异常发生处捕获及处理它,这个异常将被传播给调用的方法
-
如果将会产生异常,程序员必须仔细考虑如何及在哪里处理异常
-
从Exception类或它的一个后继类派生一个新类,就可以定义新的异常
-
方块头中的throws子句必须包含本方法中没有捕获及处理的必检异常
-
流是字节的顺序序列,它可以用做输入源或是输出的目的地
-
System类中的三个公有引用变量表示标准I/O流
-
Java类库中包含了许多类,可用来定义具有不同属性的I/O流
教材学习中的问题和解决过程
- 问题1:如何理解书中
对象的类型,而不是引用的类型,决定调用的是方法的那个版本
-
问题1解决方案:当一个父类对象的引用变量,它引用子类对象时,决定调用谁的成员方法的条件是:被引用对象的类型而不是引用变量的类型。但是这个被调用的方法必须是在父类中定义过,也就是子类覆盖过的方法。
-
问题2:关于接口的继承问题
(描述:书中介绍继承的概念出适用于类外,还适用于接口,那么接口继承是否和类继承一般不支持多继承。) -
问题2解决方案:查询资料得知,java接口可以多继承。
Interface Extends Interface0, Interface1, interface3
不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?
但接口不存在这样的问题,接口全都是抽象方法继承谁都无所谓,所以接口可以继承多个接口。
-
问题3:关于throw和throws的加深
-
问题3解决方法:通过查阅总结如下:
01.throw 是语句抛出一个异常,并获取这个异常的引用,这个异常会被抛到外部的环境,由外部环境进行处理。
02.throws 是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
03.throws可以单独使用,但throw不能, throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。
04.throw语句用在方法体内,表示抛出异常,由方法体内的语句处理throws语句用在方法声明后面,表示再抛出异常,由调用这个方法的上一级方法中的语句来处理,必须做出处理(捕获或继续声明)
05.throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常,使得提醒必须做出处理。否则编译是不会通过的。throw是具体向外抛异常的动作,所以它是抛出一个异常实例。
06.throws表示出现异常的一种可能性,并不一定会发生这些异常,在没有异常的情况下也是可以用throws的;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
代码调试中的问题和解决过程
- 问题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:Polymorphism is achieved by(多态性是通过什么实现的呢?)
A . overloading(重载)
B . overriding(重写)
C . embedding(嵌入)
D . abstraction(抽象)
E . encapsulation(封装)
1.解答:本题答案是B。当时选了D。分析每个选项:A.重载只是为具有不同参数列表的方法提供了备选方案。B.重写提供了多态性,因为适当的方法是根据当前被引用的对象而调用的。C.嵌入是类中包含的类。D.抽象与多态没有任何关系。E.封装是使用可见性修饰符(公共的、私有的、受保护的)实现的。所以选择重写。
-
问题2:Which statement is completely true?(哪句话是完全正确的?)
A . Java upcasts automatically, but you must explicitly downcast(java中向上的类型转换是自动的,但是向下的类型转换必须明确说明)
B . Java downcasts automatically, but you must explicitly upcast(java中向下的类型转换是自动的,但是向上的类型转换必须明确说明)
C . Java expects the user to explicitly upcast and downcast(java中用户向上或者向下转型时都需要明确说明)
D . Java will both upcast and downcast automatically(java中用户向上或者向下转型时都是自动的)
E . The rules for upcasting and downcasting depend upon whether classes are declared public, protected, or private(向上转型和向下转型的规则依赖于是否该类被声明为public、protected、private)
2.解答:本题答案选择A,我选择了E。Java中向上转型是自动的,它是Java支持的单一继承结构的产物。而向下转换必须由程序员显式地完成。Java只在一个方向上自动转换。向上转型和向下转型的规则并不依赖于任何方式包括使用的可见性修饰符。
-
问题3:Can a program exhibit polymorphism if it only implements early binding?(如果一个程序仅仅实现了早期绑定,那么它能显示多态吗?
)
A . Yes, because one form of polymorphism is overloading(是,因为多态性的一种形式是重载)B . No, because without late binding polymorphism cannot be supported(不,因为没有后期绑定多态不能被支持)
C . Yes, because so long as the programs uses inheritance and/or interfaces it supports polymorphism(是,因为只要程序使用继承和/或接口它支持多态)
D . Yes, because early binding has nothing to do with polymorphism(是,因为早期绑定与多态性没有任何关系)
E . none of the above(以上都不对)
3.解答:答案选A,我选了B。虽然继承和接口支持多态,但只有在有后期绑定时才会这样做。但是,重载是多态性的另一种体现形式,多个主体,只要程序使用重载,多态就在使用中。
-
问题4:The fact that the System.out.println( ) method is able to handle such a wide variety of objects, and print them correctly, is an example of the polymorphic nature of the println( ) method.(System.out.println()方法能够处理如此广泛的对象,并正确地打印它们,这是体现多态特性的一个例子。)
A.ture
B.false
4.解答:答案是A。由于println()本质上是高度多态的,所以它能够正确地打印各种预定义的(库)和内置(原始)数据。
结对及互评
点评模板:
-
博客中值得学习的或问题:
- 随着学习内容难度增加,问题分析更加深刻
- 不断查阅资料,努力解决出现的问题
-
代码中值得学习的或问题:
- 代码的逻辑性有待提高
- 代码中适当加入注释会更好
-
基于评分标准,我给本博客打分:12分。得分情况如下:
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程(2分)
-
代码调试中的问题和解决过程(2分)
-
本周有效代码超过300分行的(加0分)
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
点评过的同学博客和代码
- 本周结对学习情况
- 结对同学学号20182315
- 结对照片
- 结对学习内容
- 多态,异常
其他(感悟、思考等,可选)
- 转瞬间书本已经过半了,知识还很散,需要一次总结。
- 课外的知识汲取很有必要,没事可以多看看别人的博客,交流经验
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 77/77 | 2/2 | 15/15 | |
第三周 | 424/501 | 3/5 | 30/30 | |
第四周 | 393/894 | 2/7 | 30/30 | |
第五周 | 320/1214 | 1/8 | 30/30 | |
第六周 | 904/2118 | 2/10 | 30/30 |
-
计划学习时间:25小时
-
实际学习时间:20小时
-
改进情况: