谈谈final,finally,finalize有什么区别

final:适合在语义方面标识当前的类,方法,或者变量不可以修改。

finally:就是在处理资源关闭时需要用到。

finalize:就是java虚拟机在实现gc垃圾回收的时候调用的方法,理论上是进行内存回收等操作的地方,但实际上这个方法调用的时机也不固定,可能存在处理不当导致程序异常。并且finalize源码使用了try-catch但没有对异常作出处理,而是采用了生吞的做法,这就会导致出现问题甚至自己都找不到错误处在哪里的情况。得出结论就是放弃这个方法的实现。

private void runFinalizer(JavaLangAccess jla) {
synchronized (this) {
if (hasBeenFinalized()) return;
remove();
}
try {
Object finalizee = this.get();
if (finalizee != null && !(finalizee instanceof java.lang.Enum)) {
jla.invokeFinalize(finalizee);

/* Clear stack slot containing this variable, to decrease
the chances of false retention with a conservative GC */
finalizee = null;
}
} catch (Throwable x) { }
super.clear();
}

深拷贝和浅拷贝:

深拷贝增加了一个指针指向已存在的内存地址。

浅拷贝增加了一个指针并且申请了一个新的内存,并使指针指向新的内存。

深拷贝和浅拷贝的根本区别在于:是否真正获取了一个对象的复制实体,而不是引用。

 

为什么匿名内部类访问局部变量时,局部变量要加final关键字:

为了确保数据一致性,因为内部类访问局部变量时,是拷贝局部变量的值,而不是引用。添加final关键字后这个引用变量的地址值不会发生变化,所以这个引用变量就不会再指向其他对象了(一直会复制这个对象的值,数据一致性就有保证了)。

immutable:不可变

 

posted @ 2020-07-29 20:10  鹏鹏要努力  阅读(213)  评论(0)    收藏  举报