Override Private/Protected Method/Exception Catch
对于使用private修饰符修饰的方法,只能在当前类中访问到该方法,子类无法访问父类中定义的private方法。既然子类无法访问父类的private方法,当然也就无法重写该方法。
如果子类中定义了一个与父类private方法具有相同方法名,相同形参列表,相同返回值类型的方法,依然不是重写,只是子类中重新定义了一个新方法。如果使用@override来修饰Base类中的方法。
如果父类中定义了使用默认访问控制符(也就是不适用访问控制符)的方法,这歌方法同样可能无法被重写。
对于不使用访问控制符修饰的方法,它只能被与当前类处于同一个包中的其他类访问,其他包中的子类依然无法访问该方法。
import java.io.FileOutputStream;
import java.io.IOException;
public class ExitFinally {
public static void main(String[] args) throws IOException{
FileOutputStreamfos = null;
try{
fos= newFileOutputStream("a.bin");
System.out.println("Openresource!");
System.exit(0);
}finally{
if(fos != null){
try{
fos.close();
}catch(Exception ex ){
ex.printStackTrace();
}
}
System.out.println("Closeresource!");
}
}
}
Output:
Openresource!
这个程序的try块中增加了System.exit(0)来退出程序。如果程序在执行System.exit(0)后,finally块有时候不会执行。System.exit(0)将停止当前线程和所有其他当场死亡的线程。Finally块并不能让已经停止的线程继续执行。
当System.exit(0)被调用时,虚拟机退出前要执行两项清理工作:
执行系统中注册的所有关闭钩子;
如果程序调用了System.runFinalizerOnExit(true);那么JVM汇兑所有还未结束的对象调用Finalizer。
当Java运行时环境接收到异常对象时,系统会根据catch(XxxException)语句决定使用哪个异常分支来处理程序引发的异常。
通常情况下,如果try块被执行依次,则try块后只有一个catch块会被执行,决不可能有多个catch块被执行。除非在循环中使用了continue开始下一个循环,下一个循环又重新运行了try块,才可能导致多个catch块被执行。
比如,程序FileNotFoundExcetion异常是IOException的子类。根据Java继承的特性,子类其实是一种特殊的父类,也就是说,FileNotFoundException只是一种特殊的IOException。程序前面的catch块已经捕捉了IOException,这意味着FileNotFoundException不会被执行,然后编译器会抛错。
由于Exception是所有异常类的根父类,因此try..catch块应该把捕捉Exception的catch块排在所有catch块的最后面。否则,Java运行时将直接进入捕捉Exception的catch块(因为所有异常对象都是Exception或其子类的实例),而排在它后面的catch块将永远也不会获得执行的机会。当然,编译器会直接提示编译错误,阻止这样的代码获得执行。