首页 > 代码库 > final 和 finally你知道多少?

final 和 finally你知道多少?

一:java 里面的 final 类型修饰符

(0)finally 虽然在英语语法上是final的adv.形式,两者非常相似,但是java的应用环境却大不相同的。

(1)final类

final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确

信这个类不会再被扩展,那么就设计为final类。 final方法不能被子类的方法覆盖,但可以被继承。

(2)final方法

如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。使用final方法的原因有二:

第一、把方法锁定,防止任何继承类修改它的意义和实现。

第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

(3)final变量(常量)

用final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变!

final修饰的变量有三种:静态变量(static 属于类的)、实例变量(属于类对象的)和局部变量,分别表示三种类型的常量。

从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
另外,final变量定义的时候,可以先声明,而不给初值,这种变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

(4)final参数

当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
注:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
final不能用于修饰构造方法。
示例:

public void f1(final int i){ } //i是final类型的,值不允许改变的.

总之,一句话说明里了,学过c++的朋友,会知道非常类似c++ 里卖弄的const 类型修饰符

二:JAVA中的finally语句块

(1) 应用在 try ^ catch ^ finally 异常处理中

finally在异常处理时提供finally块来执行所有清除操作。主要与try-catch-finally配合使用。

(2)finally语句块的作用

无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。

根据JAVA规范,如果try-finally或者catch-finally中都有return,则2个return

都执行并最终返回调用者那里的是finally中的return,如果finally中没有return则返回的是catch中的return,但是finally中的代码也是要执行的。

(3)finally 虽然在英语语法上是final的adv.形式,两者非常相似,但是java的应用环境却大不相同的。

(4)try ^ catch ^ finally 异常处理中详解点击

(5) 有人可能还会问,我经常见到 如下形式 :

public void static main(String[] args){ } ,这是类的静态方法,也是一个工程的主函数入口

private final static String MyURL = "www.baidu.com/";  这是声明的类的类似全局常量一样

三:综述

(1)虽然在Java中都存在,但是并没有太多关联:final:java中的关键字,修饰符。

 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为absrtact抽象类的和final的类。
 2.如果将变量或者方法声明为final,可以保证它们在使用中不被改变.
 2.1 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。 
 2.2被声明final的方法只能使用,不能重载。

(2)finally:java的一种异常处理机制。            

finally是对Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率

final 和 finally你知道多少?