Java中 final,finally,finalize区别
final
- 是Java 中的修饰符。
- 修饰的类不能被继承,
- 修饰的方法不能被重写,
- 都需要初始化
- 修饰的变量,初始化之后不能被修改(基本类型->值不改变、引用类型->引用地址不改变)
比如:
public class Test3 {
public static void main(String[] args){
int[] test = {1,2,3,4,5};
test[2] = 100;
for (int t:test) {
System.out.println(t);
}
final int[] test1 = {1,2,3,4,5};
test1[3] = 200;
for (int t1: test1) {
System.out.println(t1);
}
}
}
打印结果:
final代表了不可变,但仅仅是引用地址不可变,并不代表了数组本身不会变
个类被声明为final,这意味着这个类不能再派生新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract 抽象类,又被声明为 final 。变量或方法被声明为final , 可以保证他们在使用中不被改变。声明为final 的变量必须在声明时给定初值,以后的引用中只能读取,不可修改。被声明为final 的方法同样只能使用,不能重写。
finally
- finally:Java 异常处理的组成部分,finally 代码块中的代码一定会执行,常用于释放资源。
- 在异常处理时提供finally块来执行相应操作。如果抛出一个异常,那么相匹配的catch语句就会被执行,然后控制就会进入finally块。
finalize
- finalize:Object 类中的一个方法,垃圾收集器删除对象之前会调用这个对象的 finalize()方法。
- finalize是方法名,Java允许使用finalize()方法,在垃圾收集器中将对象从内存中清除之前之前做必要的清理工作。这个方法是在垃圾收集器已经确定,被清理对象没有被引用的情况下调用的。
- finalize是在Object类这难搞定义的,因此,所有的类都机场塔。子类可以覆盖finalize()方法来整理系统资源或者执行其他清理工作。
finally块中的代码执行问题
问题:如果执行finally代码块之前返回了结果,或者JVM退出,这时finally块中的代码还会被执行吗
答:Java程序中的finally代码块并不一定会被执行,以下情况finally代码块不会执行。
1.try语句没有被执行到。
即没有进入try代码块,对应的finally自然不会被执行。
比如在异常处理之前程序已经返回。看下面代码,分别输入true和false
public class Test1 {
public static boolean test_finally(boolean i ){
if (i == true){
System.out.println("if");
return true;
}
try {
i = true;
return true;
}finally {
System.out.println("finally");
}
}
public static void main(String[] args){
test_finally(false);
System.out.println("-------------");
test_finally(true);
/**
* 输出:
* finally
* -------------
* if
*/
}
}
第一个执行finally了,第二个没有,return后直接不执行finally代码块。
在执行异常处理代码块之前,程序已经停止抛出异常。比如在刚刚代码前加上异常。
public static boolean test_finally(boolean i ){
int j = 1/0 ; // Exception in thread "main" java.lang.ArithmeticException: / by zero
if (i == true){
System.out.println("if");
return true;
}
try {
i = true;
return true;
}finally {
System.out.println("finally");
}
}
直接报错抛出异常,不执行finally块。
2.在try-catch块中有System.exit(0) 操作来退出JVM
System.exit(0)用于终止正在运行的JVM,会强制退出程序,这样finally块中的代码就不会执行了。
public class Test2 {
public static void test_finally(){
try {
System.out.println("try");
System.exit(0);
}finally {
System.out.println("finally");
}
}
public static void main(String[] args) {
test_finally();
/**
* 输出:
* try
*/
}
}
可以看到没有执行finally代码块,参数0代表程序正常退出,非0代表非正常退出。
总结:
在finally相对应的try语句得到执行的情况下,finally才可能执行,如果在finally执行前,程序或线程停止,finally不会执行。