问题思考
final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的(override)。总的来说用final修饰的是不可以进行更改。
finally则是Java保证重点代码一定要被执行的一种机制。我们在try-catch-finally中必须关闭io流、jdbc连接等操作。
fnalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。fnalize机制现在已经不推荐使用,并且在JDK 9开始被标记为deprecated。
结合项目中的应用:
1.final可以修饰类或方法,让别人清楚类不能进行修改,方法不能重写,可以有效避免开发者修改基础功能
2.使用final修饰参数或者变量,也可以清楚地避免意外赋值导致的编程错误,该变量不可进行重新赋值,但对于引用变量来说只是这个对象不能进行赋值,对象中的属性还是可以进行赋值的
知识拓展
一、finalize是一种已经被业界证明了的非常不好的实践,为什么会导致这些问题?
finalize的执行是和垃圾收集关联在一起的,一旦实现了非空的fnalize方法,就会导致相应对象回收呈现数量级上的变慢,有人专门做过benchmark,大概是40~50倍的下降。因为,finalize是在对象被垃圾收集前调用,这就意味着实现了finalize方法的对象是个“特殊公民”,JVM要对它进行额外处理。fnalize本质上成为了快速回收的阻碍者,可能导致对象经过多个垃圾收集周期才能被回收。
二、有什么机制可以替换finalize吗?
Java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原有的finalize实现。
三、列几个 fianlly 不会被执行的情况:
1. try-catch 异常退出。
try{
system.exit(1)
}finally{
print(abc)
}
2. 无限循环
try{
while(ture){
print(abc)
}
}fnally{
print(abc)
}
3. 线程被杀死
当执行 try,fnally 的线程被杀死时。fnally 也无法执行。
总结:
1、不要在 fnally 中使用 return 语句,
2、fnally 总是执行,除非程序或者线程被中断。
四、String类为什么要设计成final?
String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。String是不可变的关键都在底层的实现,而不是一个final。不可变的好处是安全。