`
liuzm
  • 浏览: 100958 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java中的final,finalized,finally用法

    博客分类:
  • JAVA
阅读更多
Java中的final,finalized,finally用法
final:
final可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一。
final成员
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,二是在构造函数中,两者只能选其一。
下面程序很简单的演示了final的常规用法:
public class Test{
    final int t = 1; // 在定义时给值
    // 或者(两者只能选其一)
    final int t;
    public Test(){
        t = 3; // 构造时给值
}
}

还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用,如下代码所示:
public class Test{
   void print(final String str){
        class InnerTest{
            InnerTest (){
                System.out.println(str);
            }
        }
        InnerTest it=new InnerTest ();
    }
  public static void main(String[] args){
      Test test=new Test();
      test.print("Hello word!!!");
  }
}
final方法
将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline(行内)调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
final类
当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。

finally:
finally 关键字是对 Java 异常处理模型的最佳补充。 finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。如果没有 finally,您的代码就会很费解。例如,下面的代码说明,在不使用 finally 的情况下您如何编写代码来释放非内存资源:

public void writeFile(String filePath, String fileName, String args)
            throws IOException

    {

        FileWriter fw = new FileWriter(filePath + fileName);
        try {

            fw.write(args);
        } catch (IOException e) {
            //1
            fw.close();
            throw e;
        }
//2
        fw.close();
    }
这段代码创建了一个FileWriter object,并调用 write 方法。在退出该方法之前,您必须关闭FileWriter object,以避免资源漏洞。为了完成这一任务,我们在 //2 处调用 close,它是该方法的最后一条语句。但是,如果 try 块中发生一个异常会怎么样呢?在这种情况下,//2 处的 close 调用永远不会发生。因此,您必须捕获这个异常,并在重新发出这个异常之前在 //1 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭FileWriter object。这样编写代码既麻烦又易于出错,但在没有 finally 的情况下这是必不可少的。有了 finally,前面的代码就可以重写为以下的形式:

public void writeFile(String filePath, String fileName, String args)
            throws IOException

    {

        FileWriter fw = new FileWriter(filePath + fileName);
        try {

            fw.write(args);
        } catch (IOException e) {
            throw e;
        } finally {

            fw.close();
        }
    }
finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用 close 方法。这样您就可以确信FileWriter object被关闭并且您没有泄漏资源。

finalize:

  根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。

  通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。这些资源的释放对整个应用程序是非常关键的。在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize来释放资源
本篇文章来源于 :刘志猛博客 原文链接:http://www.liuzm.com/article/java/090517.htm
更多:http://www.liuzm.com
分享到:
评论

相关推荐

    详解Java编程中final,finalize,finally的区别

    Java编程中的`final`, `finalize`, 和`finally`是三个重要的关键字,它们各自在不同的场景下发挥着关键作用。理解这三个关键字的区别对于Java开发者来说至关重要,尤其是在面试中常常会被问及。 首先,`final`是一...

    finalized_model.sav

    finalized_model.sav

    Learn Java 17 Programming 2nd Edition

    - Text blocks were introduced in Java 13 as a preview feature and were finalized in Java 17. They allow for multi-line strings with improved readability and reduced escape characters. - Example ...

    Java 亚信上海 面试题

    **final、finally、finalized的区别:** - **final**: - 修饰类:表示该类不能被继承。 - 修饰方法:表示该方法不能被重写。 - 修饰变量:表示该变量值不可变。 - **finally**: - 关键字用于异常处理结构中...

    spotify java面试题库.docx

    28. Java中存在内存泄漏,主要是由于对象不再使用但仍然被引用导致的。 29. 抽象方法不能是静态、本地或synchronized的。 30. GC(Garbage Collector)是Java的内存管理机制,负责回收不再使用的对象所占用的内存...

    java虚拟机垃圾回收详解.docx

    3. **Finalized**:在Finalizer队列中,GC会尝试执行对象的`finalize()`方法,以允许对象有机会清理资源。执行完毕后,对象的状态变为已最终化。 4. **Reclaimed**:最后,如果`finalize()`方法执行完毕后,对象...

    java虚拟机垃圾回收详解

    在Java中,`System.gc()`方法只是建议JVM进行垃圾回收,但是否实际执行取决于JVM的决定。此外,需要注意的是,对象的`finalize`方法的执行顺序是不确定的。尽管某些文档可能指出对象的`finalize`方法会按照特定的...

    Java对象在JVM中的生命周期详解

    在Java中,当我们使用new语句创建一个Java对象时,JVM就会为这个对象分配一块内存空间。例如,我们可以使用以下伪代码来创建一个Teacher对象: ```java class Teacher { String name; Set<Student> students; ...

    易宝支付笔试题

    final、finally、finalized 是 Java 语言中的三个关键字。final 是一个访问修饰符,用于修饰不能被继承的类或方法。finally 是一个异常处理语句,用于处理异常情况。finalized 是一个方法,用于垃圾回收。 9. 自动...

    Learn.Java.for.Android.Development_Apress.2010+src

    The book also briefly presents most (if not all) of Java version 7''s language features, although not much is said about closures or modules (which were not finalized at the time of writing). Java ...

    Programming In Lua First Edition(Finalized Revision 2.0) - 7Z

    关键字:Programming In Lua、Lua程序设计、Finalized Revision 2.0 译序 作为脚本语言,Lua以其简洁优雅著称,对ANSI C标准的遵循令其具有很好的可移植性,并能高效地运行于各操作系统平台。与其他脚本语言不同,...

    Object.doc

    然而,现代Java版本中已经不推荐使用此方法,因为它的行为不可预测,并且可能导致性能问题。如果确实需要进行资源清理,应该考虑使用其他机制,如 `try-with-resources` 语句或显式关闭资源。 **语法**: ```java ...

    Programming In Lua First Edition(Finalized Revision 2.0) - PDF

    - **独立的Lua解释器**:除了嵌入式使用外,Lua还支持独立运行,用户可以直接使用Lua解释器来执行Lua脚本。 #### 七、Lua的数据类型与值 - **空值类型(nil)**:表示没有值的特殊类型。 - **布尔类型(boolean)*...

    OFR-Application-Finalized

    2. **版本控制**:在开发过程中,版本控制系统如Git被广泛使用,以便跟踪代码变更和管理不同版本。"Finalized"可能意味着已经确定了发布版本。 3. **质量保证与测试**:在应用最终化阶段,质量保证(QA)团队会进行...

    JVM中对象的生命周期

    在编写高性能的Java应用时,应遵循一些最佳实践,比如避免在循环中创建对象,及时使对象符合垃圾回收标准,限制继承层次,优先使用局部变量等。这些规则有助于减少内存开销,提高系统性能,减少垃圾收集的压力。 ...

    jdk1.8_win32.rar

    **Java Development Kit (JDK) 1.8 for Windows 32-bit** JDK 1.8, also known as Java SE 8, is a major release of the Java Platform, Standard Edition, designed for developing and executing Java ...

    关于jsp的简介以及优点和缺点

    Similar to Java Servlets, JSP runs on the server side and typically returns an HTML text response to the client's browser. JSP's 1.0 specification was finalized in September 1999, followed by the 1.1 ...

    ruby初学者教程(对初学者很有帮助)

    特殊方法是指那些在Ruby中具有特殊含义的方法,例如`initialize`、`==`等。 **3.5 类变量与类方法** 类变量是以`@@`开头的变量,可以在类的所有实例之间共享。类方法则是定义在类本身上的方法。 ```ruby class ...

    爬虫代码matlab-CS388Mooney-project:CS388Mooney-project

    爬虫代码matlab ...final2.pdf for the finalized version data/src -> the source code we wrote for this project, which is explained below 履带式 /src/crawler -> Java code used to scrape down the paten

    Android内存优化1

    Android的内存管理基于Java虚拟机(JVM),在Android 5.0之前使用Dalvik虚拟机,5.0及以后使用ART(Android RunTime)。内存分配主要通过`new`关键字进行,而内存回收则依赖于垃圾回收器(GC)。Android采用了...

Global site tag (gtag.js) - Google Analytics