![f49df8f82d06f153ef56843897232d7a.png](https://i-blog.csdnimg.cn/blog_migrate/58dc001815678554134d55e75febef8b.jpeg)
final、finally、finalize
WHAT?
- final、finnally都是java语言的关键字,finnalize是方法,和java垃圾回收机制(JVM回收对象)有关
WHY?
1、final定义的变量、方法、类都会有一定的特性。
- final修饰的类不可以被继承
- final修饰的方法不可以被重写,可以被重载
- final修饰的变量,表示不可变(引用不可变,引用的值可以变) static final 修饰的就是(大写)常量
public Class TestFinal{
private static final String str = "test";//定义常量
private static final Staff staff = new Staff();//定义引用对象,引用地址不可变
public static void main(String[] args){
//str = "nomal";//报错,变量不可变,*.哪怕是方法上的形参都不可以变
//staff = new Staff();//新引用地址报错
staff.setName("张撒旦");
staff.setAge(23);
}
}
2、finally通常用于try...catch...之后的一些关闭流程资源的释放资源
- 只要try语句被执行到,那么finally语句就一定会执行,不管它运行的是try语句还是catch语句。
- 但是如果在try语句中存在System.exit(0),那么程序可能不执行finally代码块。
System.exit(int Status) 是用来结束当前正在运行中的java虚拟机,status是非0常数表示非正常退出,通常放在catch语句块中;status=0时是我们想要正常推出程序的操作。
- 由于程序执行return表示结束当前函数的调用跳出函数,因此任何语句想要执行必须在return前。如果try-catch-finally中都含有return,那么finally的retur会覆盖之前的return值。所以return不一定是函数结束的标识,也可能是对最终返回值的变更
- 仅在try/catch中存在return语句时,在finally中对返回的值又做了修改,那么如果修改的是基本类型,那么依旧返回原来的值,如果修改的是引用类型,那么会改变返回的引用的值。
与java的值传递和引用传递相关。值传递中,形参和实参有着不同的存储单元,对形参的改变不会影响实参的值;引用传递中,传递的是对象的地址,形参和实参的对象指向同一块存储单元对形参的改变就会影响实参的值。
3、finalize()类似于C++的析构函数,用来垃圾回收时处理一些事情。
public class TestFinalize{
@Override
protected void finalize(){
System.out.prinln("对象死亡了。。。");
}
public void test(){
try(){
...
}catch(Exception e){
e.printStackTrace();
}finally{
...
}
}
public static void main(String[] args){
TestFinalize tf = new TestFinalize();
System.out.println(tf.DemoFinalize);
tf = null;
System.gc();
}
}
结果:
... (try-catch语句块输出的结果,这里不太严谨)
对象死亡了。。。
主要是一些细节知识,希望以后可以用到略略略。。。