浅析java中final,finally,finalize

本文深入探讨了Java中的final关键字,包括final成员、final方法、final类及其使用场景和注意事项,同时介绍了finally关键字的作用以及finalize方法的使用。重点阐述了如何在Java程序中高效利用final关键字来实现代码的可控性和性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. final

final可以用于控制成员,方法,或者是一个类是否可以被覆写或者继承等功能,这些特点使final在java中拥有一个不可或缺的位置,也是学习java必须要掌握的关键字之一

(1)final成员

    当在类中定义变量时候,若在前面添加final关键字,那就是说,这个变量一旦被初始化,便不可改变。这里的不可改变指的是对基本类型来说

是其值不可变,而对于变量类型来说,是其引用不能改变。其初始化可以再两个地方,一是其定义处,二是在构造函数中,二者只能选其一。

    还有一种用法是定义方法中的参数为final。对于基本类型的变量,这样做没有什么实际意义,因为基本类型基本类型的变量在调用方法时是传值的。

也就是说你可以在方法中更改这个参数变量而不会影响到调用语句。然而对于对象变量,却显得很实用,因为对象变量在传递值得时候是传递他的引用的,

这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量。当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,回防止你无意的修改

而影响调用方法。


(2)final方法

将方法声明为final有两个原因,第一个就是说明已经知道这个方法提供的功能满足要求,不需要进行扩展,并且不允许任何从此类继承的类来覆写这个方法。但是

仍然可以继承这个方法,也就是说可以直接引用。第二就是允许编译器将所有对此方法的调用转化为inline(行内)调用的机制,他会在调用final方法时,直接将方法的主体

插入到调用处,而不是进行例行的方法调用,例如:保存断电,压栈等,这样可能会使程序的性能有所提高。然而当方法主体十分庞大时候,调用主体代码便会迅速膨胀,反而会影响效率。


(3)final类

当final用于类时候,就要自习考虑,因为一个final类是无法被任何类继承的。也就意味着此类在一个继承树中是一个叶子类。并且此类的设计已经被认为是十分完美的。不需要修改或者扩展。对于final类中的成员,可以是final或者不是,而对于方法,由于所属类为final的关系,自然也就成了final类型。



2.finally

   finally关键字是对java异常处理模式的最佳补充。finally结构使代码总被执行,而不管有没有异常的发生,使用finally可以维护对象的额内部状态,并可以清理非内存资源



3.finalize

根绝java语言规范,jvm保证调用finalize函数之前,这个对象是不可达的,但jvm不能保证这个函数一定会被调用。另外规范还保证finalize函数最多运行一次。通常,finalize用于一些不容易的控制,并且非常重要的资源释放。例如一些io的操作,数据的连接,。这些资源的释放对整个应用程序非常关键,在这种情况下,程序猿应该以通过程序本身管理这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅靠finalize来释放资源。。



### Javafinalfinallyfinalize的区别及用法 #### 1. `final`关键字 - **修饰类**: 当一个类被声明为`final`时,表示该类不能被继承。这意味着任何试图继承该类的行为都会导致编译错误[^5]。 - **修饰方法**: 被`final`修饰的方法不能在子类中被重写(覆盖)。这可以确保方法的行为在继承体系中保持不变[^3]。 - **修饰变量**: 当`final`用于修饰变量时,表示该变量的值一旦被初始化后就不能再被改变。对于基本数据类型,这意味着其值不可变;对于引用类型,则表示该引用不能再指向其他对象,但对象本身的内容仍可修改[^5]。 ```java // final修饰类 final class FinalClass { // 类内容 } // final修饰方法 class Parent { final void show() { System.out.println("This is a final method."); } } // final修饰变量 final int FINAL_VAR = 10; ``` #### 2. `finally`关键字 - `finally`通常与`try-catch`块一起使用,用于定义一段无论是否发生异常都必须执行的代码。即使在`try`或`catch`块中存在`return`语句,`finally`块中的代码仍然会被执行[^2]。 - `finally`的主要用途是释放资源,例如关闭文件流或网络连接等操作。 ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 处理异常 } finally { // 必须执行的代码 System.out.println("Finally block executed."); } ``` #### 3. `finalize`方法 - `finalize`是一个特殊的方法,由`Object`类定义,可以在对象被垃圾回收器回收之前调用。它提供了一个机会来执行清理工作,例如释放外部资源[^4]。 - 然而,`finalize`方法的调用时间是不确定的,依赖于垃圾回收器的行为。因此,不建议依赖`finalize`来进行关键的资源管理[^4]。 ```java protected void finalize() throws Throwable { try { // 清理资源 System.out.println("Finalize method called."); } finally { super.finalize(); } } ``` ### 注意事项 - `final`主要用于确保某些行为或状态不可改变,从而提高程序的安全性和性能。 - `finally`块总是会被执行,除非JVM退出或程序被强制终止[^2]。 - `finalize`方法的存在并不意味着对象一定会被垃圾回收,且其调用时机无法预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值