在java中,final,finally,fanalize的区别

温馨提示:内容较多,如果赶时间,可直接看文中对应的“总结”部分。想了解的多一些可耐心看完本文

一、final 用于声明属性、方法和类

1、被声明为final的变量一旦被初始化便不可改变,而在以后的引用中只能读取,不可修改。这里不可改变的意思对基本类型来说是其值不可变,对于对象变量来说其引用不可再变。其初始化有两种方式,一是在声明时给定初值,二是在构造函数中,只能二选一

public class Test{
	 final int t = 1; // 在声明/定义时给值
	 // 先声明然后在构造函数中给值
	 final int t;
	 public Test(){
	 	 t = 1; // 构造中给值
	 }
}

2、被声明为final的类意味着它不能再派生出新的子类,不能作为父类被继承。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final,所以自然也就成了final型的。因此一个类不能既被声明为 abstract的,又被声明为final的。

3、被声明为final的方法同样只能使用,不能重载。除非这个方法提供的功能已经满足你要求,不需要进行扩展,也不允许任何从此类继承的类来覆写这个方法(但是继承仍然可以继承这个方法,也就是说可以直接使用),才可以声明此方法

总结

final——修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时或构造中给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。

二、finally 是异常处理语句结构的一部分,表示总是执行。

finally 关键字是对 Java 异常处理try-catch模型的最佳补充,不管有无异常发生, finally 结构使代码总会执行。在异常处理时提供 finally 块来执行任何清除操作

案例:以 将字符数据写入文件的类 为例
(1)不加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,以免出现资源漏洞。正常逻辑我们会在执行完相应操作后再去调用colse方法,所以我们通常会在“2” 处调用 close。但是,如果 try 块中发生一个异常,那么“2” 处的 close 调用永远不会被执行,从而导致资源漏洞。如果要在异常发生时同样执行close操作,那么只能在“1” 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭FileWriter object。但是这样既麻烦又容易出错。所以我们可以在try-catch中加上 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
	  	 throw e;
 	 } finally {
	   fw.close();
 	 }
 	 //2
 }

由于 finally 结构使代码总会执行,所以无论是否发生异常,都会在退出该方法之前总会调用 close 方法,确保不会泄漏资源。

总结:

finally——无论是否发生异常处理,finally都会被执行,通常在发生异常时来执行任何清楚操作。如果抛出一个异常,那么相匹配的catch子句就会被执行,然后控制就会转入finally块。

3、finalize 是Object类的一个方法,在垃圾收集器执行的时候会被调用

方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此Java中所有类都从Object类中继承finalize()方法。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。当垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的finalize()方法,是在垃圾收集器删除对象之前对这个对象调用的。
Java语言规范保证finalize函数最多运行一次,通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接,这些资源的释放对整个应用程序是非常关键的。在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize来释放资源。

总结:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: final 是一个修饰符,能够用于类、变量和方法,表示它们不能被修改或重写。finally是一个关键字,它在异常处理语句使用,表示肯定会被执行的代码。finalize是一个Object类的方法,在垃圾收集器准备回收对象时会调用该方法,用于清理资源。 ### 回答2: 在Javafinalfinallyfinalize是三个不同的关键字,具有不同的用途和含义。 1. finalfinal是一个修饰符,用于声明一个不能被继承的类、一个不能被重写的方法、或者一个不能被修改的变量。当一个类被声明为final时,该类不能被其他类继承。当一个方法被声明为final时,该方法不能被子类重写。当一个变量被声明为final时,该变量的值不能被修改。 2. finallyfinally是一个关键字,用于定义在try-catch语句块的一个代码块,无论是否发生异常,该代码块都会被执行。finally块通常用于释放资源,比如关闭文件、网络连接等。 3. finalize:finalize是一个方法,用于在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. finalize:finalize()是一个方法名,属于Object类的一个方法,用于Java的垃圾回收机制。当一个对象变成垃圾,即没有任何引用指向该对象时,垃圾回收器会在适当的时机调用该对象的finalize()方法,进行资源释放和清理操作。但是,由于finalize()方法的执行时机不确定,并且Java8已经不鼓励使用finalize()方法,因此一般不建议使用该方法。 总结:final表示不可改变性,finally表示无论是否发生异常都会执行的代码块,而finalize是垃圾回收器在释放对象时调用的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值