Java学习笔记---其他类特性与异常处理
1. final方法
一个定义为private的方法隐式的被指定为final类型,这样无须将一个定义为private的方法再定义为final类型
2. final类
定义为final的类不能被继承。如果希望一个类不允许任何类继承,并且不允许别人对这个类有任何修改,可以将这个类设置成final形式
将某个类设置成final形式,类中的所有方法都被隐式设置成final形式,但是final类中的成员变量可以被定义为final或非final形式
3. 成员内部类
内部类可以访问外部类的成员,但是内部类的成员只有在内部类的范围内是可知的,不能被外部类使用
内部类的实例一样要绑定在外部类的实例上。
在主方法或者其他类中实例化本实例的内部对象,必须在new操作符之前提供一个外部类的引用。
Eg:
OutClass out = new OutClass( );
OutClass.innerClass in2 = out.new innerClass( );
在实例化内部类对象的时候,不能在new操作符之前使用外部类名称那种形式进行实例化内部类对象,而应该使用外部类的对象来创建其内部类的对象。
内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则不能创建内部类对象;
当一个类有内部类时,这个外部类不能声明为private或protected。
4. 静态内部类
在内部类前面添加static修饰符,这个内部类就变成了静态内部类。一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员
静态内部类的最大特点就是不能使用外部类的非静态成员
如果创建静态内部类的对象,不需要外部类对象的引用。
5. 异常处理
try语句块存放的是可能发生异常的Java语句。catch程序块在try语句块之后,用来处理被捕获的异常。另外,finally语句块是异常处理结构的最后执行部分。不管try块中代码如何退出,都将执行finally块。finally块是可选部分。
try{
//程序代码块
}catch(Exceptiontype1 e){
//对Exceptiontype1异常的处理
}catch(Exceptiontype2 e){
//对Exceptiontype2异常的处理
}finally{
//程序块
}
catch关键字后边括号中的参数类型Exceptiontype就是try代码块传递给catch代码块的异常类型
完整的异常处理语句都会包含finally语句。不管程序中有无异常发生,并且不管之间的try-catch是否顺利执行完毕,都会执行finally语句
在以下3中特殊情况下爱,finally块不会被执行
1.在finally语句块发生异常
2.在前面的代码块中用了System.exit()退出程序
3.程序所在的线程死亡。
由于exception是所有异常类的父类,如果将catch(Exception e)代码放在catch代码块的最前面,后面的catch块永远得不到执行,也就没有什么意思了
try.....catch....语句块中,多个catch的顺序一定要遵循子类在上父类在下的规则。
6. throw和throws
throws说明你有哪个可能,倾向,还未抛出,可能抛出异常
throw的话,那就是你把那个倾向变成真实的了,已经抛出了异常
同时:
1)throws出现在方法函数头;而throw出现在函数体;
2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常;
3)两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
Eg:
public class CustomExceptionDemo { private double sum = 0; public double computeProductSum(double price) throws NumberValueException{ //可能会发生NumberValueException异常 if(price < 0) throw new NumberValueException(price); //已经发生抛出了NumberValueException异常 else{ sum = sum + price; } return sum; } public static void main(String[] args) { // TODO Auto-generated method stub double priceSum = 0; CustomExceptionDemo demo = new CustomExceptionDemo(); try{ priceSum = demo.computeProductSum(5.10); priceSum = demo.computeProductSum(-12); }catch(NumberValueException e){ //捕获到了NumberValueException异常 e.printStackTrace(); System.out.println("单价" + e.getPrice() + "非法,请核对后重新计算。"); } System.out.println("商品单价的总和是:" + priceSum); } }