当前位置: 首页 > 编程笔记 >

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

查淮晨
2023-03-14
本文向大家介绍详解Java编程中final,finalize,finally的区别,包括了详解Java编程中final,finalize,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来释放资源。

总结

final— 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
 
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 

finalize— 方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。


 

 类似资料:
  • 本文向大家介绍final、finally、finalize 的区别?相关面试题,主要包含被问及final、finally、finalize 的区别?时的应答技巧和注意事项,需要的朋友参考一下 final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。 finally:是 try{} catch{} finally{} 最后一部分,表示不论发生

  • 本文向大家介绍Java中Final,Finally和Finalize之间的区别,包括了Java中Final,Finally和Finalize之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解Java中“Final”、“Finally”和“Finalize”之间的区别。 Final 它是一个关键字。 它用于对类,方法和变量施加限制。 它不能被继承。 它不能被覆盖。 final方

  • 本文向大家介绍请说明一下final, finally, finalize的区别。相关面试题,主要包含被问及请说明一下final, finally, finalize的区别。时的应答技巧和注意事项,需要的朋友参考一下 考察点:声明 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Objec

  • 问题内容: 在Java中,目的是什么做的关键字,并履行? 问题答案: 可用于标记变量“不可更改” 也可以使方法“不可替代” 也可以使类不是“可继承的”。即该类不能被子类化。 最后 在try / catch语句中用于“始终”执行代码 Java 7有一个新的try with resources语句 ,可用于自动关闭显式或隐式实现java.io.Closeable或java.lang.AutoClose

  • final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写 finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。 finalize方法用于垃圾回收。 一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需

  • 本文向大家介绍详解Java中final的用法,包括了详解Java中final的用法的使用技巧和注意事项,需要的朋友参考一下 概念 final 具有“不可改变的”的含义,可以修饰 非抽象类、非抽象成员方法和变量。 用 final 修饰的类不能被继承,没有子类。 用 final 修饰的方法不能被子类的方法覆盖(重写)。 用 final 修饰的变量表示常量,只能被赋一次值(声明变量的时候)。 注: fi

  • 本文向大家介绍java final本质详解,包括了java final本质详解的使用技巧和注意事项,需要的朋友参考一下 含义:final 含义是【仅可以被赋值一次】。 赋值位置:在【声明时赋值】、在【构造方法中赋值】 举例: 注意:我们说 final 是仅可以赋值一次没错,但是我们知道在 java 中【值有两种】,【基本数据类型的值】和【引用数据类型的值】,对于基本数据类型来说,赋值就是直接把【值

  • 本文向大家介绍详解Java编程中static关键字和final关键字的使用,包括了详解Java编程中static关键字和final关键字的使用的使用技巧和注意事项,需要的朋友参考一下 Java static关键字以及Java静态变量和静态方法 static 修饰符能够与变量、方法一起使用,表示是“静态”的。 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以st