21、多态
指把类中具有相似功能的不同方法使用同一个方法名来实现,从而可以使用相同的方式来调用具有不同功能的同名方法。
多态实现
- 重写–通过子类对父类方法的覆盖
- 重载–在同一个类中定义多个参数列表不同的同名方法
多态的实现,需要一种称为“运行时绑定(迟绑定)”的技术,就是编译器在编译时不去确定某个方法所指向的代码块是哪个,而到了执行的时候才凭借某些记号寻找该方法对应执行的代码
22、内部类
内部类是声明在外部类体内的类
- 内部类提供了某种进入其外部类对象的窗口
- 每个内部类都能独立地继承自一个(类,接口,抽象类)实现
有效地实现“多重继承”
1.1、成员内部类 MemberInner class
- 代码位置:与成员变量位置相同
- 声明格式:
‘[pullic|proyecyed|private] class 类名{}’- 在类体内,和正常类一样声明对象
- 在类体外,需要在产生外部类对象的前提下,并在访问控制允许的条件下,方可声明对象
例如:
- 公有(public)成员内部类,类外部可以访问
- 私有成员内部类,类外部不可以访问
Outer1 oc=new Outer1();
Outer1.MemberInner mi1= oc.new MemberInner();需要先new一个外部类对象,借助外部类对象new 公有成员内部类对象,就可以调用公有成员内部类的成员方法、成员变量
2.2、局部内部类
- 声明格式:
Class 类名{}- 代码位置:
成员方法体内,与局部变量位置相同- 作用范围:
从局部内部类代码结束到所在方法体结束,在方法体内,如同正常类一样声明对象
- 注意:
- 因为它天然就有访问范围的限制,故不能也不需要使用访问控制修饰符
- 方法内部类只能在定义该内部类的方法内实例化,不能在此方法外实例化
- 方法内部类对象不能使用该内部类所在方法的非final局部变量
*原因:
因为方法的局部变量位于栈上,只存在于该方法的生命周期内。当一个方法结束,其栈结构被删除,局部变量称为历史。但该方法结束后,在方法内创啊建的内部类对象可能仍然存在于堆中,这样内部类对象就无法调用局部变量了,所以它只能访问方法体内的常量
3、静态内部类
- 声明格式:
[public|protected|private] static class 类名{} - 代码位置:与静态成员位置相同
- 使用方法:
在本类内,可直接声明对象
在类体外,在访问控制允许的情况下,使用”外部类类名.静态内部类构造方法()”的方式声明一个对象 注意:
- 静态内部类只能访问外部类的静态方法和静态变量
- 静态内部类中可以定义静态或者非静态的成员
分析:
从技术上说,静态嵌套类不属于内部类。因为成员内部类与外部类共享一种特殊关系,对实例的共享关系,而静态嵌套类则没有上述关系,它只是位置在另一个类的内部,因此又称为顶级嵌套类
4、匿名内部类
为了重写父类某个方法或实现某个接口
使用匿名内部类情况:
- 只用到类的一个实例
- 类在定义后立即用到
- 类非常小(4行一下)
- 不好取类名
声明格式:
new 父类类名|接口名(){ //重写方法};
匿名内部类必须在new的后面,用其隐含实现一个接口或实现一个抽象类或继承一个普通类代码位置:出现引用变量声明时
- 使用方法:
* 声明完即生成对象,由声明时的引用变量持有。
* 无法二次生成对象;
* 不能定义任何静态成员,静态方法;
* 不能是public/protected/private;
* 不能有构造方法
23、异常处理
程序的错误分为三类:语法错误、逻辑错误、运行错误
运行错误是指程序运行过程出现的错误,分为Error和Exception。Exception通过完善程序代码消除,Error则是程序无能为力的错误,如磁盘空间不足,内存溢出等
在java中,异常作为一个特殊对象,它的类型格式Excetion及其子类,用户可通过对Exception的继承创建自己的异常类型
Throwable类是所有异常和错误的超类,它有两个子类Error和Exception
异常类类Exception 1、运行时异常 2、非运行时异常
- 运行时异常 RuntimeException类及其子类ArithmeticException(除数为0)、NullPointerException(文件不存在)、IndexOutOfBoundsException(数组下标出界)等
非运行时异常 Exception类及其子类IOException、SQLException
Throwable类方法
Throwable(String message) 以message的内容作为错误信息串创建Throwable对象
String getMessage() 若当前对象包含错误信息,本方法返回的字符串由三部分组成:当前对象的类名、一个冒号和一个空格、错误信息的字符串若当前对象不包含,则返回当前对象的类名
String toString() 若当前对象包含错误信息,本方法返回的字符串由三部分组成:当前对象的类名、一个冒号和一个空格、错误信息的字符串若当前对象不包含,则返回当前对象的类名
Void printStackTrace() 将跟踪栈中的信息输出
*java的异常处理主要包括:
1、声明异常declaring exception
2、抛出异常 throwing exception
3、捕获异常 catching exception
try语句块:
表示要尝试运行的代码,若代码出现异常则抛出异常对象
catch语句块:
当try抛出异常时,catch会捕获发生的异常,并和自己的异常类型匹配,若匹配则执行catch块中代码,并将catch参数指向所抛的异常对象。catch语句可以有多个,用来匹配try可能出现的多个异常中的一个异常,一旦匹配成功后,就不在尝试匹配别的catch块,因此,在写catch块时,要先写子类异常,再写父类异常,因为自动向上转型的存在,先写父类异常则下面子类异常代码块称为“unreachable codes”无法·访问的代码
finally语句块:
最终一定会执行被动处理异常–关键字throws
在方法的头部声明异常,一个方法可同时声明多个异常,各异常类之间用逗号隔开。
主动处理异常 Try,catch,finally
被动处理异常异常 即在它的方法声明处增加throws,将方法内没有处理的Exception继续上抛给它的调用者,最后直至JVM,由JVM将异常堆栈打印出来
声明异常指的是Java中的每个方法对他可能抛出的必检异常类型进行声明,但对免检异常Error和RuntimeException及其子类不要求在方法中显式地声明异常主动抛出
Java中的异常在方法调用时,可以形成异常链。如果方法A调用方法B,方法B又调用了方法C,若方法C声明了必检异常,则方法B在调用方法C时,必须对该异常进行处理,
处理方式1:在方法B中用try-catch代码块捕获并处理
处理方式2:不做任何处理继续把异常抛给它的调用者A
A也可把该异常抛给它的调用者main方法,从而想成异常链自定义异常
class 异常类名 extends Exception{
public 异常类名(String msg){
super(msg);
}
}