对于初学java的人来说,经常会混淆final,finally,finaliz的功能和意义,相对来说final使用的比较多。说到final就不得不提到static,因为两者同属于修饰符且有一定的共同点:final

java中,final修饰相当于c、c++中的const,表示不可更改。

(1)final修饰变量

表示该变量为常量,并且使用之前一定要初始化,而且一旦被赋值就不可更改。final修饰常规数据类型(int,long...)时候表示该变量的值不能改变,当final修饰一个引用类型的时候,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。例如 :public final int[] arr = {1, 2, 3, 4};arr指向不能更改,但是arr[0],arr[1],arr[2],arr[3]的值都可以改变。当函数的参数类型声明为final时,说明该参数是只读型的。

(2)final 修饰方法

表示不允许从此类派生的的子类中来重覆写此方法,即可以锁住该方法,防止子类修改该方法的意义。但是,子类可以继承该方法,也可以调用该方法。同时,子类可以重构该final方法(方法名相同但是参数列表不同);使用final方法需谨慎。

(3) final修饰类

当一个类被修饰为final时,它的含义很明确,就是不允许该类被继承,也就是说,该类“绝后”了,任何继承它的操作都会以编译错误告终。final 类的方法可以是final,也可以是非final的;其中的数据成员可以是final的也可以不是,他们将服从final data的原则。static

static表示“全局”或者“静态”的意思,用来修饰成员变量或者成员方法和代码块。主要用途就是在没有创建对象实例的情况下调用该类的方法或者使用该类中的成员变量。

(1)static方法

静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。反之,在非静态方法中可以访问静态方法或者成员变量。

(2)static成员变量

静态变量被所有的对象所共享,在内存中只有一个副本,java虚拟机只为静态变量分配一次内存,在加载该类的过程中完成对静态变量的内存分配,可以用类名直接访问,也可以由对象来访问,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

(3)static代码块

static代码块主要作用是优化程序性能(只会在类加载的时候执行一次)。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

例如:

每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费

但是,要使用static代码块:

因为static代码块只会执行一次,所以节约了空间。

finally

java的一种异常处理机制。 当catch到异常以后,finally里面的内容一定会执行,常将还原某个设置(如autoCommit),网络连接,文件传输等相关的内容写在里面。finally是对Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。

finalize

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