一、内部类
Java允许类可以有一种成员:内部类。
Java支持在一个类中定义另一个类,这个类称做内部类,而包含内部类的类称为内部类的外嵌类。
内部类和外部类之间的重要关系:(1)内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法;(2)内部类的类体中不可以声明变量和类方法,外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员;(3)内部类仅供它的外嵌类使用,其他类不可以使用某个类的内部类声明对象。
Java编译器生成的内部类的字节码文件的名字和通常的类不同,内部类对应的字节码文件的名字格式是 “外嵌类名$内部类名”。
内部类可以被static修饰。类是一种数据类型,那么static内部类就是外嵌类中的一种静态数据类型,这样一来,程序就可以在其他类中使用static内部类来创建对象,static内部类不能操作外嵌类中实例成员变量。
二、匿名类
Java允许我们直接用一个类的子类的类体创建一个子类对象,也就是说创建子类对象时,除了使用父类的构造方法还有类体,此类体被认为是一个子类去掉类声明后的类体称做匿名类。
Bank的匿名子类:new Bank() {
匿名类的类体
}; 注意:结尾加分号
匿名类可以继承父类的方法也可以重写父类的方法。
使用匿名类时,必然是在某个类中匿名类创建对象,因此匿名类一定是内部类。
匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法。
由于匿名类是一个子类,但没有类名,所以用匿名类创建对象时,要直接使用父类的构造方法。
匿名对象的引用可以传递给一个匹配的参数。
与接口有关的匿名类:
Java允许直接用接口名和一个类体建立一个匿名对象。
假设Computable是一个接口,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称做匿名类。
new Computable() {
实现接口的匿名类的类体
}
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口中的全部方法。
三、异常类
异常是指程序运行时可能出现的一些错误。
try — catch 语句
try {
包含可能发生异常的语句
}catch(ExceptionSubClass1 a) {
}catch(ExceptionSubClass1 b) {
}
一旦try部分抛出异常,或调用某个可能抛出异常对象的方法,并且该方法抛出了异常对象,那么try部分将立刻结束执行,转向相应的catch部分。
程序可以将发生异常后的处理放在catch部分。
try — catch语句可以由几个catch组成,分别处理发生的相应异常。
各个catch参数中的异常类都是Exception的某个子类,表示try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。
自定义异常类
在编写程序时可以扩转Exception类定义自己的异常类,然后根据程序的需要来规定哪些方法产生这样的异常。
一个方法在声明时可以使用throws关键字声明产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致该方法结束执行。
程序必须在 try — catch 块语句中调用可能发生异常的方法,其中catch的作用是捕捉throw关键字抛出的异常对象。
声明该方法可能抛出的异常 public void someMethod() throws Exception { }
构造抛出的异常对象 throw new 异常类();
调用该方法试图捕捉异常 try {
}catch( ) {
定义处理异常的代码
}