内部类定义在局部时:
1.不可以被成员修饰符(static等)修饰
2.可以直接访问外部类中的成员(因为还持有对外部类的引用),不可以访问内部类所在的局部中的变量,只能访问final修饰的局部变量。final局部变量在方法结束后出栈。
匿名内部类:
1.就是内部类的简写格式(没名字的内部类)
2.定义匿名内部类的前提:内部类必须是继承一个类或者实现接口
格式: new 内部的父类/接口()------------>构造函数
{复写/实现内容}
这代表创建一个父类的匿名子类对象,这个对象可以调用成员(包括实现父类方法,或者新创建的子类方法)
如果要为对象起名字,可以利用多态:父类 名字 = new 父类(){复写方法},但是使用该变量名只能使用父类方法。
可以通过静态函数返回一个父类/接口类型的匿名对象,然后实现调用。
注意:如果父类方法太多,不建议用匿名内部类,因为要对父类的方法进行复写;如果接口的方法不多,可以直接传进去一个匿名对象,从而避免创建一个新类实现接口
异常
异常也是具体的事物,也可以通过java类的形式进行描述,并封装成对象。是java对不正常情况进行描述后的对象体现。
严重的:Error类进行描述,一般不编写代码处理
非严重的:通过Exception类进行描述,可以使用针对性方式处理
两者都有一些共性内容----父类是Throwable类
异常的处理:java提供特有语句try catch finally
try{需要检测的代码}
catch(异常类 变量){处理异常的代码:处理方式}
finally{一定要执行的语句}
问题被封装成了对象,抛给了调用者,try检测到问题,跳转到catch并把对象给catch,没问题不执行catch
(Exception e = new ArithmeticException)
对catch到的异常现象进行常见方法的操作:
异常类.getMessage()可以返回详细信息
toString()返回更详细的字符串
printStackTrace()返回异常名称,异常信息和异常出现位置,就是jvm默认的异常处理机制
标识:throws Exception 通过关键字throws声明了该功能可能会出现问题。把问题抛出
对多异常的处理
1.声明异常时,建议声明更为具体的异常,可以处理更具体,并且可以声明多个异常。
2.声明几个异常,就对应几个catch块。如果多个catch块出现继承的异常,父类异常catch放在最下面
3.catch处理时,要定义具体的处理方式,不应只输出问题语句
自定义异常:
新关键字throw(而不是throws):throw new NewException
当函数内部出现了throw抛出异常对象,那就必须要给出对应的处理动作。要么在内部try catch处理,要么在函数上声明对象(抛)。
*函数内出现异常,函数上需要声明throws 异常
定义异常信息:复写getMessage(),因为父类中已经把异常信息的操作都完成了,所以子类在构造时,将异常信息通过super语句传给父类构造函数,就可以直接通过getMessage()得到异常信息
继承Exception原因:异常体系有一个特点:异常类和异常对象都需要被抛出,都具备可抛性,只有Throwable类才有这个特征,只有这个体系中的类和对象才可以被抛(throw.throws)
throws使用在函数上,跟的异常类;throw使用在函数内,后面跟的是异常对象.
runtime异常 特殊
如果在函数内容抛出该异常,函数上可以不用声明,编译通过。因为不需要让调用者处理。
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过(因为没办法处理,希望程序停止并修正代码)
异常分两种:
1.编译时被检测的异常,非Runtime,没有标识的编译失败
2.编译时不被检测的异常(RuntimeException以及子类)
异常finally
存放的是一定会被执行的代码,通常用于关闭资源。即使函数中有return也会执行这里的代码。
应用:例如数据库的使用有:连接数据库,操作数据,关闭数据库。而关闭数据库的操作是抛出异常后必须要执行的,所以关闭数据库的操作要放到finally。
格式:try+catch,try+catch+finally,try+finally
catch是处理异常,如果没有就代表异常不被处理,如果异常是检测时异常,那么必须声明
异常在子父类覆盖中的体现:
1.子类覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法:只能抛出父类的异常或者该异常子类的异常(这是因为父类的检测方法只能接收父类的异常或该异常的子类),如果发生新异常不能throw,只能try。
2.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不可以抛出异常。如果子类出现异常必须进行try,不能throw。