20182303 2019-2020-1 《数据结构与面向对象程序设计》第6周学习总结
教材学习内容总结
Chapter9
- 多态
- 多态性是对象多种表现形式的体现。
- 多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
- 多态存在的三个必要条件
- 继承。在多态中必须存在有继承关系的子类和父类。
- 重写。子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型。在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
- 绑定
- 前期绑定:在编译过程中就已经知道这个方法到底是哪个类中的方法,此时由编译器或其它连接程序实现。java当中的方法只有
final
,static
,private
和构造方法是前期绑定。 - 后期绑定是在运行时根据具体对象的类型进行绑定。
- 前期绑定:在编译过程中就已经知道这个方法到底是哪个类中的方法,此时由编译器或其它连接程序实现。java当中的方法只有
- 接口
- 目的
- 语法
- 创建多态引用
- 使用继承机制
基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。 - 使用接口
通过实现接口并覆盖接口中同一方法的不同类体现多态。
Chapter10
- Error
- 用于指示合理的应用程序不应该试图捕获的严重问题。
- 大多数这样的错误都是异常条件。虽然
ThreadDeath
错误是一个“正规”的条件,但它也是Error
的子类,因为大多数应用程序都不应该试图捕获它。 - 在执行该方法期间,无需在其
throws
子句中声明可能抛出但是未能捕获的Error
的任何子类,因为这些错误可能是再也不会发生的异常条件。 - Java程序通常不捕获错误。
- Exception
IOException
(I/O输入输出异常),其中IOException
及其子类异常又被称作"checked exception"RuntimeException
(运行时异常)RuntimeException
被称作"unchecked exception"
- 自定义异常类型
Java的异常机制中所定义的所有异常不可能预见所有可能出现的错误,某些特定的情境下,则需要我们自定义异常类型来向上报告某些错误信息。
编写自己的异常类时需要注意:- 所有异常都必须是 Throwable 的子类。
- 如果希望写一个检查性异常类,则需要继承 Exception 类。
- 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
- 异常的处理方式
try-catch
用于捕获异常。try-catch
代码块放在异常可能发生的地方。
try-catch
代码块中的代码称为保护代码,使用try-catch
的语法如下:
一个 try 代码块后面跟随多个try { // 程序代码 } catch(ExceptionName e1) { //Catch 块 }
catch
代码块的情况就叫多重捕获。如下:try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }
throws
&throw
如果一个方法没有捕获一个检查性异常,那么该方法必须使用throws
关键字来声明。throws
关键字放在方法签名的尾部。也可以使用throw
关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
例:
public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition }
finally
无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally
代码块出现在catch
代码块最后,如下:
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }
教材学习中的问题和解决过程
- 问题1:关于多态中的向上转型和向下转型要怎么理解?
- 问题1解决方案:
向上转型:子类引用的对象转换为父类类型。
向下转型:与向上转型相反,即是把父类对象转为子类对象。
- 父类引用可以指向子类对象,子类引用不能指向父类对象。
- 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如Father father = new Son();
- 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father
其中father前面的(Son)必须添加,进行强制转换。 - upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
- 向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
- 问题2:
Error
和Exception
有什么区别? - 问题2解决方案:
Throwable
有两个重要的子类:Exception
(异常)和Error
(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Exception
(异常)是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。在EchoInput
类中,当试图调用readLine()
方法时,可能出现IOException
异常。Exception
类有一个重要的子类RuntimeException
。RuntimeException
类及其子类表示“JVM常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException
、ArithmeticException
)和ArrayIndexOutOfBoundException
。Error
(错误)表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时出现的问题。例如,当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError
。
代码调试中的问题和解决过程
- 问题1:第九章课本代码
Hourly.java
出错
- 问题1解决方案:将
count--;
用注释隐去后,即可正常编译运行。 - 问题2:运行第十章课本代码
SecretTest.java
时发现加密未成功。
- 问题2解决方案:
encrypt()
中的加密条件打错了,如下:
成功加密后运行结果如图:
代码托管
上周考试错题总结
- The type of the reference, not the type of the object, is use to determine which version of a method is invoked in a polymorphic reference.(引用的类型,而不是对象的类型,用于确定在多态引用中调用方法的哪个版本。 )
A .true
B .false
正确答案: B 我的答案: A
解析:决定调用哪个方法的是对象的类型,而不是引用的类型。 - Binary search can be used on unsorted data it will just perform more slowly.(二分法检索可以用于未排序的数据,它只会执行得更慢。)
A .true
B .false
正确答案: B 我的答案: A
解析:只有对数据进行排序后,二分法检索才起作用。 - When a program terminates because a thrown exception is not handled, the program
A .starts up again automatically
B .opens a dialog box, which asks the user whether the program should start again, end, or enter a debugging mode
C .saves all output to a disk file called the "runStackTrace.txt"
D .opens a dialog box for the user to specify a disk file name, and all output is stored to that disk file
E .outputs a message indicating what and where the exception was thrown
正确答案: E 我的答案: B
解析:如果在程序中的任何地方未捕获抛出的异常,程序将终止,并显示运行堆栈跟踪的内容。运行堆栈跟踪上的第一个项是抛出的异常及其抛出位置(引发异常的类的方法的行号)。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 10000行 | 30篇 | 400小时 | |
第一周 | 254/254 | 2/2 | 21/21 | 开始编写简单的程序 |
第二周 | 132/386 | 1/3 | 26/47 | 学会使用Scanner类 |
第三周 | 632/1018 | 2/5 | 21/68 | 学会使用部分常用类 |
第四周 | 663/1681 | 2/7 | 27/95 | junit测试和编写类 |
第五周 | 1407/3088 | 2/9 | 30/125 | 继承以及继承相关类与关键词 |
第六周 | 2390/5478 | 1/10 | 25/150 | 面向对象三大属性&异常 |
-
计划学习时间:20小时
-
实际学习时间:25小时