`
esffor
  • 浏览: 1370776 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浅谈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来释放资源。
  
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1613162

本文转自
http://blog.csdn.net/lddongyu/archive/2007/05/17/1613162.aspx
分享到:
评论

相关推荐

    详解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**: - 关键字用于异常处理结构中...

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

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

    spotify java面试题库.docx

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

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

    Java虚拟机(JVM)的垃圾回收(Garbage Collection, GC)是Java编程中的关键概念,它自动管理程序中的内存,避免程序员手动处理内存释放,从而减少内存泄露和程序崩溃的风险。垃圾回收机制的主要目标是识别并回收...

    java虚拟机垃圾回收详解

    Java中的垃圾回收主要包括三个关键步骤:标记、扫描和清除。在这些步骤中,JVM会判断哪些对象是可达的,哪些是不可达的。对于不可达的对象,它们会被标记为可回收,并在后续的垃圾回收周期中被释放。 首先,了解一...

    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 ...

    易宝支付笔试题

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

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

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

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

    ### Lua程序设计基础...以上概述了《Programming In Lua》第一版中关于Lua的基础知识,这些知识点涵盖了Lua的主要特点、应用场景、学习准备、运行环境、版本信息以及基本概念等方面,为初学者提供了全面深入的理解。

    OFR-Application-Finalized

    在IT行业中,"Finalized"通常指的是产品已经过了alpha和beta测试,具备了稳定的性能和完整的功能。 描述中的"OFR-应用程序最终化"进一步强调了这是一个特定的软件应用,可能是一个桌面应用、移动应用或者Web应用,...

    Object.doc

    ### Java Object类中的核心方法详解 #### 概述 在Java编程语言中,`Object` 类是最基本且最重要的类之一,所有的其他类都是通过继承 `Object` 而来的。因此,深入理解 `Object` 类及其提供的方法对于任何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 ...

    JVM中对象的生命周期

    在Java虚拟机(JVM)中,对象的生命周期包含了多个阶段,这些阶段共同决定了一个对象从诞生到消亡的过程。以下是这些阶段的详细介绍: **创建阶段(Creation)** 在这个阶段,对象从无到有,主要经历以下几个步骤:...

    关于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 ...

    爬虫代码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

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

    puts "Object finalized." end end ``` **12.5 跟踪程序的运行** 可以使用`set_trace_func`等方法来调试程序。 ```ruby def my_trace_func(event, file, line, id, binding, classname) puts "Event: #{event}...

    delphi反编译工具 Decompiler v1.1.0.194

    commented ASM code with references to strings, imported function calls, classes methods calls, components in the unit, Try-Except and Try-Finally blocks. Note, this is a rewrite of the original DeDe....

Global site tag (gtag.js) - Google Analytics