一、前言
这次说说final、finally、finalize这三者的区别,其实对这三者有了解的程序员,基本都知道,他们三个之间没有毛线关系。就是因为名字相似,其他的什么也没有。
二、final
- final可以修饰类、方法、变量。表示被修饰的类、方法、变量具有不可变的特性。
- 1.修饰变量,表明定义后值不能被改变
- 2.修饰方法,表明方法是最终方法,只能被调用,不能覆盖,但是可以被重载
- 3.修饰类,表明类是最终类,不能被继承
修饰变量:
当对a赋值后,再次赋值会报错;
/**
* 修饰变量
*/
@Test
public void test1() {
final int a;
int i = 1;
int j = 2;
a = i;
System.out.println(a);
a = j;
System.out.println(a);
}
修饰方法:方法可以被重载,不能被重写
修饰类:类不可被继承
三、finally
finally是异常处理中的,最后执行的一些收尾的工作,回收资源,比如关闭数据库连接,关闭io通道,关闭缓冲区等。
为了保证一定能回收try块中打开的物理资源,异常处理机制提供了finally块。不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块总会被执行。
以文件输入流展示: 无论是否报错,都执行finally块。
package com.dmsd.finaltest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* finally 异常后收尾,清除操作
* Created by Ares on 2018/3/29.
*/
public class finallyTest {
public void finallyTest1() {
FileInputStream fileInputStream =null;
try {
fileInputStream =new FileInputStream("cat.jpg");
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
注意:通常情况下,不要在finally块中使用return或者throw等导致方法终止语句,一旦在finally中使用了,将会导致try块、catch块中的return、throw语句失效。
原因:当java程序执行try块、catch块的时候,执行到了return或者throw抛出错误,导致方法结束,但是系统执行到了这两个语句,不会马上结束方法,而是去寻找异常处理中,有没有finally块。如果没有就执行return或者throw。如果有的话,会立即执行finally块中的代码,直到finally执行完成后,才会再跳回来执行try…catch中的return或者throw;如果finally中使用了return或者throw等终止语句,finally块已经终止了方法,系统不会跳回执行try…catch的任何代码了。
public static boolean test(){
try
{
//因为finally块中包含了return语句,下面的return失效
return true;
}
finally{
return false;
}
}
四、finalize() 方法
首先注意一下,finalize()是一个方法,这个方法位于java.lang.Object类下:
protected void finalize() throws Throwable { }
作用是:
在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
注意:
永远不要主动调用某个对象的finalize()方法,该方法应交给垃圾回收机制调用
finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当成一定会被执行的方法
当JVM执行可以恢复对象的finalize()方法时,可能使用该对象或系统中其他对象重新编程可达状态
当JVN调用finalize()方法出现异常的时候,垃圾回收机制不会报告异常,程序继续执行。
class People{
final void output(String name){
System.out.println(name);
}
}
class Stu extends People{
final void output(String name,int id){//可以被重载
System.out.println(name);
}
public void finalize() throws Throwable{
super.finalize();
System.out.println("finalize method was called!");
}
}
public class Main {
public static void main(String[] args){
}
}
五、小结
多总结,多使用,多体验吧。