20182320《程序设计与数据结构》第六周学习总结
20182320《程序设计与数据结构》第六周学习总结
教材学习内容总结
1. 第九章
1.1 后绑定
首先,我们调用一个类的方法,需要经历下面几个步骤:
(1)创建引用对象,例如
Scanner scan;
(2)将引用对象指向一个对象
通常是如下指向引用时声明的类
scan = new Scanner("abc");
但是多态引用如果通过继承实现多态可以指向声明类的子类,假设Scanner有个子类Scn
Scn scn = new Scn();
scan = scn;
可简写成
scan = new Scn();
(3)调用类的方法
int x = scan.nextInt();
绑定指的是将方法的调用与方法的定义绑起来,即(2)和(3)绑起来。
普通的方法调用和定义可以再编译时完成,但是多态引用的要到运行时才能完成,这个延时的提交被称为后绑定或动态绑定。
1.2 通过继承实现多态
根据上面的(2)举的例子和第八章学习的继承,我们可以用下面这个例子进行说明如何用继承实现多态。
这里有一个类Mammal,他有个子类Horse
Mammal pet;//先创建Mammal的引用变量
Horse a = new Horse();//创建Horse的对象
pet = a;//pet指向Horse的对象
这就是多态的实现了,虽然pet声明是一个Mammal变量,但是却能够指向继承于它的子类的对象。
注意: 若在这里进行pet的方法调用,只能调用Mammal类和Horse类都有的方法,而且这个同名的方法应该是调用是Horse中的版本。
1.3 接口
1.3.1 什么是接口?
答:接口是一组抽象方法,可以用来创建多态引用。
1.3.2 接口的特点
一、它和抽象方法一样,没有方法体。
二、一个类要实现一个接口,需要在类后加“implements 接口名”,并给出接口中每个方法的定义。
三、当一个类实现一个接口时,它可以访问接口中定义的所以常量和方法。
四、接口可以派生
五、接口中的所有成员都是公有的
1.3.3 Comparable接口
是一个定义在java.lang包中的接口,提供对象之间的比较功能。
1.3.4 Iterator接口
是一个定义在Java标准类库的接口,用来表示类的一组对象,并提供从头至尾每次访问一个对象的功能。
1.4 通过接口实现多态
首先有一个接口Speaker:
public interface Compare {
public void Input(String str1,String str2);
public void Cp();
}
有一个Man类实现了它:
public class CompareSon implements Compare{
String str3,str4;
@Override
public void Input(String str1, String str2) {
str3=str1;
str4=str2;
}
@Override
public void Cp() {
if (str3.length()>str4.length()){
System.out.println("str1>str2");
}
else if (str3.length()==str4.length()){
System.out.println("str1=str2");
}
else {
System.out.println("str1<str2");
}
}
public void Connect(){
System.out.println(str3+str4);
}
}
则在下面这个例子可提现接口实现的多态:
public class Run {
public static void main(String[] args) {
Mammal mammal;
mammal=new Dog();
}
}
2.第十章
2.1 异常
2.1.1 什么是异常?
它是一个对象,定义了不经常出现的或错误的情形。
Java预定义了一组程序运行可能会出现的异常和错误。
2.1.2 异常的处理
(1)不处理异常
程序会终止,然后产生一条信息,描述发生的异常和异常位置。
(2)在异常发生的地方处理
使用try-catch子句捕获异常,finally子句无论是异常退出程序还是正常捕获都会执行。
(3)在程序的其他地方处理异常
如果一个异常在它发生的地方没有被捕获,它会向调用它的方法,这个叫异常传播。
处理方法是在调用它的方法出使用try-catch或是在方法头加上throws抛出异常。
2.1.3 自定义异常
想要自己定义一个异常类,只需要让他派生于Exception类就行了。
2.1.4 必检异常和免检异常
(1)必检异常:
必须被一个方法捕获或在方法头的throws子句抛出
(2)免检异常:
不需要被捕获或抛出。
只有RuntimeException或其后代类的对象才是免检异常,其余都是必检异常。
教材学习中的问题和解决过程
-
问题1:当使用多态引用,将父类的声明的对象指向子类时,这个父类的对象是否可以调用子类的方法?
-
问题1解决方案:实践
-
问题2:当子类对象强制转换成父类时,是否能调用父类的方法?
-
问题2解决方案:实践
代码调试中的问题和解决过程
- 问题1:如下,想使用“==”来实现字符串是否相等的检测
- 问题1解决方案:CSDN
突然想起来这相当于是比较str和“DONE”的地址,这两个的内容虽然一样,但地址永远不可能相等。
因此要用String类的equals方法来判断。
- 问题2:想像C语言中那样直接使用对象数组,但是报错,如下:
- 问题2解决方案:CSDN
应该要向上面那样,分别创建对象,再将对象赋给数组。
代码托管
上周考试错题总结
错题1:
原因1:
这里考的是继承所体现的概念,应该是代码复用,而不是接口。
错题2:
原因2:
Object类是所有类的祖宗,equals用来确定两个对象是否是同一个对象,toString用来将一个对象转换成一个字符串。但是,compareTo不是由对象实现的,必须在希望实现Comparable接口的任何类中实现
。
错题3:
原因3:
一个变量呗声明为一个类,然后指向另一个类,这是典型的多态。
错题4:
原因4:
多态变量可以具有许多不同的类型,但是在程序执行之前,它不知道自己具有哪种类型。在引用变量时,必须做出决策。该决策是由运行时环境根据变量的最新赋值做出的。
错题5:
原因5:
答案应该是A+B,super既能访问父类的构造方法,还能访问它的方法和实例数据,所以最终只能选E。
错题6:
原因6:
抽象类不能被实例化。
结对及互评
点评过的同学博客和代码
其他(感悟、思考等,可选)
多态的相关使用情况其实和C语言中的数制转换很相似,例如,子类的引用变量指向父类的对象可以类比为float型转换成int型,float型丢失的数据就像子类引用变量丢失的在父类中不存在的方法。
学会编写自定义异常类和学会捕捉异常能在我们调试代码时帮我们尽快找到并修改程序的错误,因此要熟练掌握。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 208/208 | 2/2 | 9/9 | |
第二周 | 258/466 | 2/4 | 15/24 | |
第三周 | 693/1159 | 2/6 | 22/46 | |
第四周 | 1383/2542 | 2/8 | 30/76 | |
第五周 | 1300/3842 | 2/10 | 22/98 |