final关键字
final是一个修饰符,有一下三种用法:
1、修饰在类上,表示类不可以被继承
格式:public final class A{}
2、修饰在属性上,表示属性为常量,不可被更改
注意:
成员属性的常量没有默认值,要初始化
局部属性(即方法内的属性)的常量有默认值
3、修饰在方法上,表示该方法不可被重写
finally关键字
含义:
经过异常处理代码块(即经过了try...catch...语句)之后,无论是否产生异常必定会执行的代码块
一般用于资源的释放
注意:
finally代码块不执行的情况有如下情况:
1、没有进入到try代码块,相应的finally也不会执行
2、在finally代码块之前调用了System.exit();退出了虚拟机
3、线程在执行到try代码块后被kill掉,则无法执行finally
在try…catch…代码块中执行了return语句,finally何时执行:
public class Demo1 {
public static void main(String[] args) {
Person p = haha();
System.out.println(p.age);
}
public static Person haha(){
Person p = new Person();
try{
p.age = 18;
return p; //程序执行到此处时,先将p运算完得到一个需要return的拷贝,但不return
//然后去执行finally代码块,执行完毕后,再将刚刚运算得到的p对象return出去
}catch(Exception e){
return null;
}finally {
p.age = 28;
}
}
static class Person{
int age;
}
}
由于p是一个引用类型,所以
运行结果:
28
注意:
如果p是一个基本数据类型:
public class Demo2 {
public static void main(String[] args) {
int a = haha();
System.out.println(a);
}
public static int haha(){
int a = 10;
try{
return a;
}catch(Exception e){
}finally {
a = 20;
}
return 0;
}
static class Person{
int age;
}
}
运行结果:
10
finalize方法
是Object类中的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法
注意:
该方法只会被执行一次
jdk9之后就不再使用
例:
public class Test{
public static void main(String[] args) throws Exception{
Person person = new Person();
System.out.println("person创建了");
if (person.p == null){
System.out.println("Person中的静态属性为空");
}
person = null;//将指向该对象的引用置为null
System.gc();//调用辣鸡肥收器
Thread.sleep(1000);//确保守护线程工作完毕再继续执行
if (Person.p != null){
System.out.println("Person中的静态属性不是空");
}
person = Person.p;//重新给person引用赋值
person.p = null;//并将其中的属性置为空
person = null;//再将指向该对象的引用置为null
System.gc();//调用辣鸡肥收器
Thread.sleep(1000);
if (Person.p == null){
System.out.println("Person中的静态属性为空");
}
}
}
class Person{
static Person p;
@Override
protected void finalize() throws Throwable {
System.out.println("finalize方法执行了");
p = this;
}
}
运行结果:
person创建了
Person中的静态属性为空
finalize方法执行了
Person中的静态属性不是空
Person中的静态属性为空