【Java】疯狂Java基础(二)——final, finally, finalize 的区别

一、前言

      这次说说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){  
     }  
}

五、小结

      多总结,多使用,多体验吧。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你个佬六

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值