Java小知识(一)、final, finally, finalize的区别

480 阅读3分钟

final

final在Java中是一个保留的关键字,可以用来修饰类、方法和变量(包括成员变量和局部变量);如果使用了final进行修饰,所修饰的将不可改变;

用法

1、修饰类

用final修饰一个类时,这个类将不能被继承,所以用final修饰的类一般都是功能完整的。且final修饰的类中的方法都会隐式定义为final方法。

2、修饰方法

用final修饰一个方法时,该方法将不能被子类重写,所以用final修饰的方法应该是一个完整的功能且不需要被改变的。

而且final方法比非final方法快,因为编译时就将fianl修饰的方法转入内嵌机制,从而提升了执行效率

3、修饰变量

修饰变量分两种

1、修饰基本数据类型:在数据初始化之后就不能改变。

2、修饰引用类型:在数据初始化之后不能将其指向另一个对象。

注:引用对象不可变,但是对象的内容可变

finally

finally也是java一个关键字,是Java异常处理的组成部分之一,主要作用是在finally代码块中的代码不管是否出现异常都一定会执行,因此常用于关闭、释放资源等操作。

不执行情况

1、System.exit(1)方法:表示系统非正常退出,从而导致finally代码块中的代码不能执行

2、halt方法:将强行终止当前正在运行的Java虚拟机,这样也会导致finally代码块中的代码不能执行

3、守护线程:如果守护线程刚好执行到finally代码块时,程序没有任何其他非守护线程时,那么Java虚拟机将退出,也不会等待守护线程中的finally代码块执行完成。

Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
任何一个守护线程都是整个JVM中所有非守护线程的保姆
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;
只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器)

finalize

finalize是Object类中的一个方法。

主要由垃圾回收器调用,且无论这个对象是什么状态,finalize方法只会调用一次,然后在下次的垃圾回收动作发生时真正回收对象所占空间。

注:finalize()可以主动调用, 但是最好不要主动调用, 因为在代码中主动调用之后, 如果JVM再次调用, 由于之前的调用已经释放过资源了,所以二次释放资源就有可能出现导致出现空指针等异常, 而恰好这些异常是没有被捕获的, 那么就造成对象处于被破坏的状态, 导致该对象所占用的某一部分资源无法被回收而浪费.