final、finalize和fianlly

可能猛的一看好像这些有着联系,但是其实他们一点关系都没有,只是长的很像的。

就像是生活中有些人虽然长的很像,但是一点血缘关系都没有,除非时电影、电视剧中,只要是长得像就会有点关系(哈哈)

虽然没关系但是他们的作用也要搞清楚

final(三大修饰符之一):

可以修饰类(此类不能被继承)

可以修饰方法(此方法不能被覆盖)

可以修饰变量:此变量值不可改变--常量(无初始值、只允许赋值一次)

各种常量的赋值:

1). 局部常量:显示初始化

2). 实例常量的赋值:显示初始化、动态代码块、构造方法。

3). 静态常量的赋值:显示初始化、静态代码块。

不同常量类型的特点:

1). 基本数据类型常量:值不可变。

2). 引用数据类型常量:地址不可变。

finalize()方法:

finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。

当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列

垃圾对象:没有有效引用指向此对象,为垃圾对象(两个对象相互引用也为无效引用)

垃圾回收:由GC销毁垃圾对象,释放数据存储空间

自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象

手动回收机制:使用System.gc();通知JVM执行垃圾回收(执行有间隔时间)如果在执行过程中,被别的有效引用指向此对象,那么垃圾回收将不再回收此对象,容易造成内存泄漏

垃圾复活:

protected void finalize(){  
        super.finalize();  
        System.out.println("execute method finalize()");  
        //将想要回收的垃圾做有效引用  
    } 

不建议使用子类覆盖Object中的finalize()方法去手动执行垃圾回收

finally:

finally一般用在如果出现异常的时候,可以去关闭资源,减少资源占用

public class TestFinally {

    public static void main(String[] args) {
        StringBuffer a = test2();
        String s = a.toString();
        int i = Integer.parseInt(s);
        System.out.println(i);
    }
    public static StringBuffer test2(){
        StringBuffer a = new StringBuffer();
        try{
             a.append("1");
            return a;
        }catch( Exception e ){
            e.printStackTrace();
             return a;
        }finally{
            a.append("2");
        }

    }
}

结果:12

发布了24 篇原创文章 · 获赞 69 · 访问量 1173

猜你喜欢

转载自blog.csdn.net/S9264L/article/details/104761706
今日推荐