当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-final、finally、finalize 的区别

金三银四精选java面试题-final、finally、finalize 的区别

来源:图灵教育
时间:2023-11-27 10:24:54
 

final、finally、finalize 的区别

  • final 关键字:用于修饰类、方法、变量、入参和对象
      • 应用于时,表示该类是最终类,不能被其他类继承
      • 应用于方法时,表示该方法是最终方法,不能被子类重写
      • 应用于变量时,表示该变量是一个常量,只能赋值一次
      • 应用于入参时,表示该入参在方法内无法被修改
      • 应用于对象时,该对象的引用不能被修改,但对象本身的状态是可变的。
  • finally 关键字:异常处理机制中的一部分,用于定义在 try-catch-finally 块中的 finally 块
      • 不论是否发生异常,finally 块中的代码都会执行。
      • 主要用于释放资源、关闭连接等必须确保执行的操作。
  • finalize 方法:是一个对象的方法,定义在 Object 类中
      • 在垃圾回收器将对象回收之前调用。
      • 可以重写 finalize 方法,在其中编写对象在被回收前需要进行的清理操作,如释放资源等。
      • 请注意,不推荐使用 finalize 方法进行内存资源的释放,因为它没有被及时执行的保证,也可能导致性能问题
import org.junit.Test;

/**
 * @author 百里
 */
public final class BaiLiTest {
    final int a = 0;  //final修饰变量

    /**
     * finally 与try-catch配合使用
     * final 修饰入参
     * @param num1
     * @param num2
     */
    public void dividEnumbers(int num1, final int num2) {
        try {
            int result = num1 / num2;
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("Divide by zero exception!");
        } finally {
            System.out.println("Finally block executed.");
        }
    }

    /**
     * finally测试方法
     * 利用final修饰的变量
     */
    public void finallyTest() {
        //a = 1; //无法重新赋值,会提示异常。
        divideNumbers(10, a);
        System.out.println("-----可以进行修改数据------------------------");
        divideNumbers(10, a + 1);
    }

    @Override
    protected void finalize() throws Throwable {
        //TODO:释放资源,等其他操作
        super.finalize();
        System.out.println("调用finalize方法在执行垃圾回收");
    }

    /**
     * finalize用法
     */
    public void finalizedTest() {
        BaiLiTest baiLiTest = new BaiLiTest();
        baiLiTest = null;
        System.gc();
    }
}


//final修饰的类无法被子类继承
// public class BaiLiTest2 extends BaiLiTest {
    
// }