天天看点

java常见面试题:finalize final finally1.final2.finally3.finalize

目录

1.final

1.1 final修饰的类

1.1.1 特殊的final类-String

1.2 final修饰的方法

1.3 final修饰的变量

2.finally

3.finalize

1.final

用途:可修饰类、方法、变量。

1.1 final修饰的类

不能被继承,因此该类中的方法都不能被重写。接口及抽象类不能用final修饰。

1.1.1 特殊的final类-String

字符串常量池是java堆内存中一个特殊的存储区域。当我们建立一个String对象时,如果常量池不存在该字符串,则创建一个新字符串;若存在则直接引用已经存在的字符串。字符串只要赋值就相当于新new一个对象,字符串变量指向这个新new的对象,之前的对象就成了没有引用指向的对象了。

1.2 final修饰的方法

不能被重写。

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

1.3 final修饰的变量

如果是基本数据类型,初始化之后成员变量的值不能被改变,即为常量。final修饰一个成员变量,必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值;

如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的。

final修饰方法的参数,在参数在方法内值不能被改变。因为方法调用的时候,参数必须是初始化的。

注意:方法内部类,访问该方法内定义的变量,该变量必须要用final修饰。当内部类访问局部变量时,会扩大局部变量的作用域,如果局部变量不用 final 修饰,我们就可以在内部类中随意修改该局部变量值,而且是在该局部变量的作用域范围之外可以看到这些修改后的值,会出现安全问题。

2.finally

用途:与try/catch搭配使用,正常情况下,无论try执行代码块中是否抛出异常,都会执行finally里面的语句,常用finally中释放资源,比如io流。

非正常情况:比如在 try 语句块中执行了 System.exit (0) 语句,终止了 Java 虚拟机的运行。或者当一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。

3.finalize

用途:finalize是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收。Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收。一般是不需要程序员去实现finalize的。

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

参考文章:

https://blog.csdn.net/Beixiaozhang/article/details/52955862

https://www.cnblogs.com/ktao/p/8586966.html