final, finally, finalize的区别

final修饰符(关键字)如果一个被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承因此一个类不能既被声明为 abstract的,又被声明为final

那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了 final型的。你也可以明确的给final 类中的方法加上一个final,但这显然没有意义

 

被声明为final变量要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值,而在以后的引用中只能读取,不可修改。

如: final int i//int型常量

注意:对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。

 

如果方法被声明为final. 那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法。     

但是继承仍然可以继承这个方法,也就是说可以直接使用

 

finally在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finally代码总会被执行,而不管有无异常发生。

如:

class WithFinally{
 public void foo2() throws IOException{
   //
在任一个空闲的端口上创建一个套接字

   ServerSocket ss = new ServerSocket(0);
   try {
     Socket socket = ss.accept();
     //
此处的其他代码...
   }finally {
     ss.close();
   }
 }

}
finally
确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用 close 方法。这样您就可以确信套接字被关闭并且您没有泄漏资源。在此方法中不需要再有一个 catch 块。如果您确实提供了一个 catch 块,则 finally 块中的代码在 catch 块完成以后执行。

finally
块必须与 try try/catch 块配合使用。此外,一般不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。即使在try 块使用了return语句强制函数返回,但finally中的还是要执行

!!!但有一种方法可以退出 try 块而不执行 finally 块。如果代码在 try 内部执行一条 System.exit(0)System.exit(0)   强行退出JVM; 语句,则应用程序终止而不会执行 finally 执行。

附注:System.exit(0);是系统关闭,也就是你的平台虽然关闭了,但在你的内存还是占有着,
     dispose();
是释放资源,也就将你的平台从内存中释放!(建议用这种)

 

finalize是位于Object类的一个方法,该方法的访问修饰符为protected,由于所有类为Object的子类,因此用户类很容易访问到这个方法。由于,finalize函数没有自动实现链式调用,我们必须手动的实现,因此finalize函数的最后一个语句通常super.finalize()。通过这种方式,我们可以实现从下到上实现finalize的调用,即先释放自己的资源,然后再释放父类的资源。根据Java语言规范,JVM保证调用finalize函数之前,这个对象是不可达的,但是JVM不保证这个函数一定会被调用。另外,规范还保证finalize函数最多运行一次。通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。这些资源的释放对整个应用程序是非常关键的。在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize来释放资源。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值