内部类
类有两种成员,成员变量和方法。实际上,Java还允许类有一种成员,即内部类。
内部类的定义
Java 支持在一个类中声明另一个类,这样的类称为内部类
,而包含内部类的类称为内部类的外嵌类
。
内部类和外嵌类之间的重要关系如下:
- 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外类中的方法。
- 在内部类的类体中不可以声明类变量和类方法,在外嵌类的类体中可以用内部类
明对象作为外嵌类的成员。 - 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。
static 内部类
内部类可以被修饰为 static 内部类。类是一种数据类型,static内部类就是外嵌类中的一种静态数据类型。(非内部类不可以是static类)
这样,程序就可以在其他类中使用 static 内部类来创建对象了。要注意的是, static内部类不能操作外嵌类中的实例成员变量。
匿名类
假如没有显式地声明一个类的子类,而又想开子类创建一个对象。就可以用到匿名类
和类有关的匿名类
Java 允许用户直接使用一个类的子类的类体创建一个子类对象。
也就是说,在创建对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称为匿名类。匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象直接用匿名类创建一个对象。
new People(){
匿名类类体;
};
因此,匿名类可以继承父类的方法,也可以重写父类的方法。
使用匿名类时,必然是部个类中直接用匿名类创建对象,因此,匿名类一定是内部类
,匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明 static成员变量和 static 方法。
由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法。
尽管匿名类创建的对象没有经过类声明步骤,但匿名对象的引用可以传递给一个区参数,匿名类的常用方式是向方法的参数传值。
和接口有关的匿名类
假设A是一个接口,那么,Java 允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了A接口的类去掉类声明后的类体,称为匿名类。
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,但类体必须重写接口中的所有方法。
异常类
所谓异常,就是程序运行时可能出现一些错误,例如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。
Java的异常经常出现在方法调用过程中,即在方法调用过程中抛出异常对象,导致程序运行出现异常,并等待处理。
try…catch 语句
Java使用try…catch语句
来处理异常,将可能出现的异常操作放在try…catch语句的try部分
,当try部分中的某个方法调用发生异常后,try部分将立刻结束执行,而转向执行相应的catch部分;所以程序可以将发生异常后的处理放在catch部分。
try…catch语句可以由几个catch组成,分别处理发生的相应异常。
try…catch语句的格式如下:
try{
包含可能发生异常的语句,即可能 throw 关键字抛出了异常对象(抛出 Exception 子类对象)
}
catch(ExceptionSubClass1 e){
...
}
catch(ExceptionSubClass2 e){
...
}
各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常。
在catch部分,如果其中两个catch的参数*(即Exception子类)*之间有父子关系,那么子类catch必须在父类catch的前面(否则保留父类catch 即可)。
自定义异常类
我们也可以扩展Exception类定义自己的异常类,然后规定哪些方法产生这样的异常。
一个方法在声明时可以使用throws关键字
声明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并使用throw关键字
抛出该异常对象,导致该方法结束执行。
程序必须在try…catch块语句中调用能发生异常的方法,其中catch的作用就是捕获throw方法抛出的异常对象。
throw是Java的关键字,该关键字的作用就是抛出异常。throw和throws是两个不同的关键字。
finally 子语句
finally子语句是try··catch语句的可选部分
语法格式如下:
try{}
catch(ExceptionSubClass e){}
finally{}
其执行机制是:
在执行try…catch语句后,执行finally子语句,也就是说,无论在try部分是否发生过异常,finally子语句都会被执行。
但需要注意以下两种特殊情况:
- 如果在try…catch语句中执行了return语句,那么finally子语句仍然会被执行。
- try…catch语句中执行了程序退出代码,即执行“System.exit(0);”,则不执行finally子语句(当然包括其后的所有语句)。