内部类和异常类
内部类
ava支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。
注意
(1)内部类的类体中不可以声明类变量和类方法。
(2)外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
内部类的使用规则:
声明内部类如同在类中声明方法或变量一样,一个类把内部类看作是自己的成员。
外嵌类的类体中可以用内部类声明的对象,作为外嵌类的成员。
外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
内部类的类体中不可以声明类变量和方法。
外嵌类和内部类在编译时,生成两个.class文件。
public class Example7_1 {public static void main(String args[]) {RedCowForm form = new RedCowForm("红牛农场");form.showCowMess();form.cow.speak();//RedCowForm.RedCow redCow = new RedCowForm.RedCow(180,119,6000);//redCow.speak();}
}
class RedCowForm {static String formName;RedCow cow; //内部类声明对象RedCowForm() {}RedCowForm(String s) //构造方法{cow = new RedCow(150,112,5000);formName = s;}public void showCowMess() {cow.speak();}class RedCow { //内部类的声明String cowName = "红牛";int height,weight,price;RedCow(int h,int w,int p){height = h;weight = w;price = p;}void speak() {System.out.println("偶是"+cowName+",身高:"+height+"cm 体重:"+weight+"kg,生活在"+formName);}} //内部类结束
}
匿名类
Java允许我们直接使用一个类的子类的类体创建一个子类对象。
1.和子类有关的匿名类
创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称作匿名类。
假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类)创建对象:
new Bank ()
{ 匿名类的类体
};
2.和接口有关的匿名类
假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。
下列代码就是用实现了Computable接口的类(匿名类)创建对象:
new Computable()
{实现接口的匿名类的类体
} ;
异常类
所谓异常就是程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误作出处理。程序运行出现异常时,Java运行环境就用异常类Exception的相应子类创建一个异常对象,并等待处理。
try…catch语句
Java使用trycatch语句来处理异常,将可能出现的异常操作放在trycatch语句的try部分,将发生异常后的处理放在catch部分。
try~catch语句的格式如下:
try
{包含可能发生异常的语句
}
catch(ExceptionSubClass1 e)
{…
}
catch(ExceptionSubClass2 e)
{…
}
例子:
class DangerException extends Exception {final String message = "超重";public String warnMess() {return message;}
}class CargoBoat {int realContent; //装载的重量int maxContent; //最大装载量public void setMaxContent(int c) {maxContent = c;}public void loading(int m) throws DangerException {realContent += m;if(realContent>maxContent) {throw new DangerException(); }}
}public class Example7_8 {public static void main(String args[]) {CargoBoat ship = new CargoBoat();ship.setMaxContent(1000);int m = 0;try{ m =600; ship.loading(m);m = 400;ship.loading(m);m = 367;ship.loading(m);m = 555;ship.loading(m);}catch(DangerException e) {System.out.println(e.warnMess()); System.out.println("无法再装载重量是"+m+"吨的集装箱"); try {ship.loading(-m); //卸载货物} catch(DangerException exp) { System.exit(0); //程序退出,不再给机会} }finally {System.out.printf("货船将正点启航\n");System.out.println("目前装载了"+ship.realContent+"吨货物");}}
}