浅谈Java中的final,finally以及finalize

浅谈Java中的final,finally以及finalize

   本文主要是为那些对Java中final,finally以及finalize不是很熟的学习者一个简单参考,本文章的主要参考书籍《Java编程思想》
  • final模块
  • finally模块
  • finalize模块

final模块

   根据上下文环境,Java的关键字final的含义存在着细微的差别,但它通常指的是“这是无法改变的”,原因无非是两种:设计或者效率。
   这里主要谈论三个只用到final的方面:数据、方法以及类

final数据

final数据 主要是想编译器告知其指向的数据是恒定不变的,主要的作用是,比如:
1、一个永久不变的编译时常量;
2、一个在运行时被初始化的值,你不希望它改变。

final修饰静态变量
   无论 static 还是 final 字段,都只能存储一个数据,而且不得改变。
   若随同对象句柄使用 final,而不是基本数据类型,它的含义就稍微让人有点儿迷糊了。对于基本数据类型, final 会将值变成一个常数;
   然而,对象本身是可以修改的(简单点说,就是final修饰的那个变量内存储的对象地址不能修改,但是所指向的对象是可以修改的)。 
(注:在Java中,根据惯例,及时static优势final的域江永大写表示,并且使用下划线分割各个单词)
/*
*代码来自于《Java编程思想》
*/
class Value {
    int i = 1;
}
public class FinalData {
// Can be compile-time constants
    final int i1 = 9;
    static final int I2 = 99;
    // Typical public constant:
    public static final int I3 = 39;
    // Cannot be compile-time constants:
    final int i4 = (int)(Math.random()*20);
    static final int i5 = (int)(Math.random()*20);
    Value v1 = new Value();
    final Value v2 = new Value();
    static final Value v3 = new Value();
    //! final Value v4; // Pre-Java 1.1 Error:
    // no initializer
    // Arrays:
    final int[] a = { 1, 2, 3, 4, 5, 6 };
    public void print(String id) {
        System.out.println(
            id + ": " + "i4 = " + i4 +
            ", i5 = " + i5);
    }
    public static void main(String[] args) {
    FinalData fd1 = new FinalData();
    //! fd1.i1++; // Error: can't change value
    fd1.v2.i++; // Object isn't constant!
    fd1.v1 = new Value(); // OK -- not final
    for(int i = 0; i < fd1.a.length; i++)
        fd1.a[i]++; // Object isn't constant!
        //! fd1.v2 = new Value(); // Error: Can't
        //! fd1.v3 = new Value(); // change handle
        //! fd1.a = new int[3];
        fd1.print("fd1");
        System.out.println("Creating new FinalData");154
        FinalData fd2 = new FinalData();
        fd1.print("fd1");
        fd2.print("fd2");
    }
} ///:~
空白final
   允许我们创建“空白 final”,它们属于一些特殊的字段。尽管被声明成 final,但却未得到一个初始值。
   然而,对于 final 关键字的各种应用,空白 final 具有最大的灵活性。
   举个例子来说,位于类内部的一个 final 字段现在对每个对象都可以有所不同,同时依然保持其“不变”的本质。下面列出一个例子
//: BlankFinal.java(代码来自《Java编程思想》)
// "Blank" final data members
class Poppet { }
class BlankFinal {
    final int i = 0; // Initialized final
    final int j; // Blank final
    final Poppet p; // Blank final handle
    // Blank finals MUST be initialized
    // in the constructor:
    BlankFinal() {
        j = 1; // Initialize blank final
        p = new Poppet();
    }
    BlankFinal(int x) {
        j = x; // Initialize blank final155
        p = new Poppet();
    }
    public static void main(String[] args) {
        BlankFinal bf = new BlankFinal();
    }
} ///:~
final参数
   Java允许在参数列表中一声明的方式将参数指明为final。这以为这你无法再发放中更改参数引用所指向的对象。
   声明举例:int test(final int i)...

final方法

使用final方法的原因有两个:
1、把方法锁定,以防止任何的继承类修改它,也即不允许覆盖。
2、程序执行的效率。将一个方法设成 final 后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。(而不是跳转)
class PersonalLoan{
    public final String getName(){
        return "personal loan";
    }
}
class CheapPersonalLoan extends PersonalLoan{
    @Override
    public final String getName(){
        return "cheap personal loan"; //compilation error: overridden method is final
    }
} 

final类

   如果说整个类都是 final,就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。
   换言之,出于这样或那样的原因,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。
   除此以外,我们或许还考虑到执行效率的问题,并想确保涉及这个类各对象的所有行动都要尽可能地有效。
final class FinalClass{...}

public class FinalClassTest extends FinalClass{...} 
//error:Cannot extend final class 'FinalClass'

finally模块

  与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。
  (无论一个违例是否在 try 块中发生,我们经常都想执行一些特定的代码,该部分代码可放于finally中。)
  使用 finally 可以维护对象的内部状态,并可以清理非内存资源。 如果没有 finally,您的代码就会很费解。
public class HelloFinally {

    public static void main(String[] args) {
        int count  = 0;
        while(true) {
            try {
            // post-increment is zero first time:
            if(count++ == 0)
                throw new Exception();
            System.out.println("No exception");
            } catch(Exception e) {
                    System.out.println("Exception thrown");
            } finally {
                    System.out.println("in finally clause");
                    if(count == 2) break; // out of "while"
            }
        }
    }
} ///:~

finally用来做什么

   在没有“垃圾收集”以及“自动调用破坏器”机制的一种语言中, finally 显得特别重要。
   因为程序员可用它担保内存的正确释放—— 无论在 try 块内部发生了什么状况,内存总是会得到释放。
   当要把除内存之外的资源恢复到他们的厨师状态是,就要用到finally子句:已经代开的文件或者网络连接。

在return中使用finally

   因为finally子句总会被执行,所以在一个方法中,可以从多个点返回,并且可以保证重要的清理工作仍旧要进行。
public class MultipleReturns{
    pulic static void  test(int i)
    {
        try{
            System.out.println("Point 1");
            if(i == 1) return;
            System.out.println("Point 2");
            if(i == 2) return;
            System.out.println("Point 3");
            if(i == 3) return;
            System.out.println("END");
        }finally{
            System.out.println("Performing cleanup");
        }
    }
}

finalize模块

Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。
   (1).对象不一定会被回收。
   (2).垃圾回收不是析构函数。
   (3).垃圾回收只与内存有关。
   (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: final 是一个修饰符,能够用于类、变量和方法,表示它们不能被修改或重写。finally是一个关键字,它在异常处理语句使用,表示肯定会被执行的代码。finalize是一个Object类的方法,在垃圾收集器准备回收对象时会调用该方法,用于清理资源。 ### 回答2: 在Javafinalfinallyfinalize是三个不同的关键字,具有不同的用途和含义。 1. finalfinal是一个修饰符,用于声明一个不能被继承的类、一个不能被重写的方法、或者一个不能被修改的变量。当一个类被声明为final时,该类不能被其他类继承。当一个方法被声明为final时,该方法不能被子类重写。当一个变量被声明为final时,该变量的值不能被修改。 2. finallyfinally是一个关键字,用于定义在try-catch语句块的一个代码块,无论是否发生异常,该代码块都会被执行。finally块通常用于释放资源,比如关闭文件、网络连接等。 3. finalizefinalize是一个方法,用于在Java对象被垃圾回收器销毁之前进行一些清理工作。finalize方法的定义在Object类,可以被子类重写。finalize方法在垃圾回收器准备销毁对象时会被调用,但并不能保证一定会执行,因为垃圾回收是由垃圾回收器自行决定的。 总结: final用于修饰类、方法或变量,表示不可继承、重写或修改。finally用于定义在try-catch语句块的一个代码块,无论是否发生异常,都会执行。finalize是一个方法,在Java对象被销毁之前执行一些清理工作,但不能保证一定会被执行。 ### 回答3: 在Javafinalfinallyfinalize是三个不同的概念。 1. finalfinal是一个关键字,可以修饰变量、方法和类。当用final修饰变量时,表示该变量的值不可被更改。当用final修饰方法时,表示该方法不可被子类重写。当用final修饰类时,表示该类不可被继承。final要用于限定对象的状态、行为或结构的不可改变性。 2. finallyfinally也是一个关键字,用于定义在try-catch结构的一个代码块。无论try块是否发生异常,finally的代码都会被执行。通常用finally来释放资源、关闭文件、数据库连接等必要的清理操作。 3. finalizefinalize()是一个方法名,属于Object类的一个方法,用于Java的垃圾回收机制。当一个对象变成垃圾,即没有任何引用指向该对象时,垃圾回收器会在适当的时机调用该对象的finalize()方法,进行资源释放和清理操作。但是,由于finalize()方法的执行时机不确定,并且Java8已经不鼓励使用finalize()方法,因此一般不建议使用该方法。 总结:final表示不可改变性,finally表示无论是否发生异常都会执行的代码块,而finalize是垃圾回收器在释放对象时调用的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值