第三章 多态
3.2 什么是多态
简单来说,多态(polymorphism)是具有表现多种形态的能力的特征。更专业化的说法:同一个实现接口,使用得到实例而执行不同的操作。
3.2.1 子类到父类的转换(向上转型)
将int型常量或变量的值赋给double型变量,可以自动进行类型转换。
int i = 5;
double dl = 5;
将double型常量或变量的值赋给int型,进行强制类型转换。
double d2 = 3.14;
int a = (int) d2;
子类转换成父类的规则:
将一个父类的引用指向一个子类对象,称为向上转型(upcasting),自动进行类型转换。
通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。
通过父类引用变量无法调用子类特有的方法。
3.2.4 父类到子类的转换(向下转型)
将一个指向子类对象的父类引用赋给一个子类的引用,称为向下转型,此时必须进行强制类型转换。
3.2.5 instanceof运算符
instanceof的语法:
对象 instanceof类或接口
该运算符用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false。在强制类型转换类型之前通过instanceof运算符检查对象的真实类型,再进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
在进行引用类型转换时,先通过instanceof运算符进行判断,再进行相应的强制类型转换,这样可以有效地避免出现类型转换异常。
使用instanceof运算符时,对象的类型必须和instanceof的第二个参数所指定的类或接口在继承树上有上下级关系,否则会出现编译错误。
instanceof通常和强制类型转换结合使用。
通过多态可以减少类中的代码量,提高了代码扩展性和可维护性。继承是多态的基础,没有继承就没有多态。
使用父类作为方法形参和使用父类作为返回值类型是使用多态得到常用方式。
第四章 接口
4.1.2 什么是接口
在软件中,接口是一种规范标准,它们可以约束类的行为,是一些方法特征的集合,但是没有方法的实现。接口可以看作是一种特殊的“抽象类”,但是采用与抽象类完全不同的语法来表示,两者的设计理念是不同的,抽象类利于代码的重复性,接口利用代码的1扩展和维护。
Java中接口的定义语法和类实现接口的语法如下:
语法
【修饰符】interface接口名exteds父接口1,父接口2······{
//常量定义
//方法定义
}
语法
class类名extends父类名implements接口1,接口2,······{
//类成员
}
说明
(1)接口的命名规则与类相同。如果修饰符public,则该接口在整个项目中可见;如果省略修饰符,则该接口只在当前包可见。
(2)接口中可以定义常量,不能定义变量。接口中的属性都会自动用public static final修饰,即接口中的属性都是全局静态变量。接口中的常量必须在定义时指定初始值。
(3)接口中所有方法都是抽象方法。接口中方法都会自动用public abstract修饰,即接口中只有全局抽象方法。
(4)和抽象类一样,接口也不能实例化,接口中不能有构造方法。
(5)接口之间可以通过extebds实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
(6)接口的实现类必须实现接口的全部方法,否则必须定义为抽象类。
一个类只能有一个直接父类,但可以通过implements实现多个接口。当类继承父类的同时又实现了多个接口时,extends关键字必须位于implements关键字之前。
第六章 异常
6.1.2 什么是异常
异常就是在程序的运行过程中所发生的不正常的事件,如所需文件找不到、网络连接不通或中断、类型转换异常等等。异常会中断正在运行的程序。
if-else处理异常的缺点:
(1) 代码臃肿,加入了大量的异常情况判断和处理代码。
(2) 程序员把相当多的精力放在了异常处理代码上,放在了“堵漏洞”上,减少了编写业务代码的时间,必然影响开发效率。
(3) 很难列举使用的异常情况,程序扔旧不健壮。
(4) 异常处理代码和业务代码交织在一起,影响代码的可读性,加大日后程序的维护程度。Java就是这么做的。
6.2.2 tyy-catch块
try-catch程序块执行可能出现的三种情况:
(1)如果try中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略。
(2)如果try语句块在执行过程中遇到异常,并且这个异常与catch中声明的异常类型相匹配,那么在try块在其余剩下的代码都将被忽略,而相应的catch块将会被执行。
(3) 如果try语句块在执行过程中遇到异常,而抛出的异常在catch块里面没有被声明,那么程序立刻提出。
在catch中可以加入用户自定义处理信息,也可以调用异常对象的方法输出异常信息,常用方法有两种:
(1)vpid printStackTrace():输出异常的堆栈信息。堆栈信息包括程序运行到当前类的执行程序,它将输出从方法调用处的方法调用序列。
(2)String getMessage():返回异常信息描述字符串。该字符串描述异常产生的原因,是printStackTrace()输出信息的一部分。
说明:
如果在try块在执行过程在遇到异常,那么在try块中其余剩下得到代码都将被忽略,系统会自动生成相应的异常对象,包括异常的类型、异常出现时程序的运行状态及对该异常的详细描述。如果这个异常对象与catch中声明的异常类型相匹配,会把该异常对象赋给catch后面的异常参数相应的catch块将会被执行。
6.2.3 try-catch-finally块:
1.如果try块中所有语句正常执行,那么finally块就会被执行。
2.如果try语句块在执行过程中,碰到异常,无论这种异常能否被catch块捕获到,都将执行finally块中的代码。
try-catch-finally结构中try块是必需的,catch和finally块为可选,但两者至少须出现其中之一。
finally块中的语句不被执行的唯一情况:在异常处理代码中执行System.exit(l),将退出Java虚拟机。
6.2.4 多重catch块:
一段代码可能会引发多种类型的异常,这时,可以在一个try语句块后面跟多个catch语句块,分别处理不同的异常。但排列顺序必须是从子类到父类,最后一个一般都是Exception类。因为所有异常子类的继承到Exception类,所以如果将父类异常放到前面,那么所有的异常都将被捕获,后面catch块中的子类异常将得不到被执行的机会。
在使用多重catch块时,catch块的排列顺序必须是从子类到父类,最后一个一般都是Exception类。
6.2.5 声明异常-throws
throws可以同时声明多个异常,之间用逗号隔开。
异常的处理方式:
(1)通过try-catch捕获并处理。
(2)通过throws继续声明异常。如果调用者不打算处理改异常,可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将由Java虚拟机来处理。