final, finally, finalize 的区别

final:

在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)

1、final类中所有的成员方法都会隐式的定义为final方法。

2、若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。

3、final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。类似于C++中的const。

4、final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式

一种是在变量声明的时候初始化;

第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值

finally:

1、只有与finally对应的try语句块得到执行的情况下,finally语句块才会执行。

2、在 try 语句块中执行了 System.exit (0) 语句,终止了 Java 虚拟机的运行,不会执行finally语句块

3、当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)、被终止(killed)、突然死机或者断电,都不会执行finally语句块

4、finally块的语句在try或catch中的return语句执行之后返回之前执行,finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

finalize :

finalize()是在java.lang.Object里定义的,这个方法在gc启动,该对象被回收的时候被调用,一般是不需要程序员去实现finalize的;

特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。

使用finalize还需要注意一个事,调用super.finalize();

一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法

原文地址:https://www.cnblogs.com/goodbye-lazy/p/11220825.html