final、finally与finalize三者的区别

摘要:final为常量关键字,而finally为异常关键字,finalize为object自带方法名。看到这个题目,感觉像是高中题目一样。出题者用心良苦啊,将这三个联系起来,考察java基本功。在实际中finalize这个用得最少,而其他两个都很熟悉了。但若想流畅的表达三者区别,还需自己好好理一理。
一、final这个关键字在Java中代表不可改变的,可用来修饰类,方法,变量。
对class来说,用法如:final class A{}代表类A为终极类,不能被继承,也就没有子类之说与接口实现者之说。因此一个类不能既被声明为 abstract,又被声明为final。
对method来说,用法如:public final void test(){} 代表此方法不能被重写。
对variable来说,必须在声明时赋值,且不能再改变。
先看看这个测试类:

public class Test { 
    int i =1;
    final Test t  = new Test();//Test对象引用变量t不能再指向其他Test对象,但可以通过t来改变此对象中的非常量属性值。 
    public final void test(){
        final int i = 1;//final修饰的变量必须在声明时赋值,且不能再改变。
        t.i++;
    }   
}

二、finally关键字用在异常处理中,用于处理异常后的清理工作,实际中一般用于关闭文件流,释放资源等操作。

System.out.println("----game start----");
try {
    System.out.println("----try----");
    return ;
} catch (NullPointerException e) {
    System.out.println("----catch----");
} finally {
    System.out.println("----finally----");
}       
System.out.println("----game over----");

打印结果:

----game start----
----try----
----finally----

三、finalize一方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,它是在 Object 类中定义的,因此所有的类都继承了它,子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub  
        for(int i=0;i<6;i++){
            System.gc();
            Test t = new Test();            
        }
        System.gc();//若注释此语句,则只打印0-4,这就是Java垃圾回收机制的一个简单验证。
    }
    static int count;
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("-----------finalize-----------"+count++);
    }       
}

打印如下:
———–finalize———–0
———–finalize———–1
———–finalize———–2
———–finalize———–3
———–finalize———–4
———–finalize———–5

猜你喜欢

转载自blog.csdn.net/tiangongkaiwu152368/article/details/68958367