java互联网FOR面试-JAVA基础-面试常问

虽然面的是高级,但是有的公司还是喜欢问这种初级问题,有时候还真想不起来,所以扫一眼也好

一.final修饰在类、方法、属性上都有什么作用(瓜子二手车)

    修饰类:这个类不能被继承。如:String类、StringBuffer类、System类。

    修饰方法:不能被重写。如:Object类的getClass()方法。

    修饰属性:此属性就是一个常量,一旦初始化就不可再被赋值。习惯上,常用大写字符表示。

    变量static final修饰:全局常量

二.finalize的作用(瓜子二手车)

    finalize()是Object中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情(这个对象可以趁这个时机挣脱死亡的命运)。

要明白这个问题,先看一下虚拟机是如何判断一个对象该死的。

     Java采用可达性分析算法来判定一个对象是否死期已到。Java中以一系列"GC  Roots"对象作为起点,如果一个对象的引用链可以最终追溯到"GC  Roots"对象,那就天下太平。否则如果只是A对象引用B,B对象又引用A,A,B引用链均为能达到"GC  Roots"的话,那它俩将会被虚拟机宣判符合死亡条件,具有被垃圾回收器回收的资格。

        上面提到了判断死亡的依据,但被判断死亡后,还有生还的机会。
如何自我救赎:
1.对象覆写了finalize()方法(这样在被判死后才会调用此方法,才有机会做最后的救赎);
2.在finalize()方法中重新引用到"GC  Roots"链上(如把当前对象的引用this赋值给某对象的类变量/成员变量,重新建立可达的引用).
需要注意:
finalize()只会在对象内存回收前被调用一次(The  finalize method is never invoked more than once by a Java virtual machine for any given object. );
finalize()的调用具有不确定行,只保证方法会调用,但不保证方法里的任务会被执行完(比如一个对象手脚不够利索,磨磨叽叽,还在自救的过程中,被杀死回收了)。
       虽然以上以对象救赎举例,但finalize()的作用往往被认为是用来做最后的资源回收。
基于在自我救赎中的表现来看,此方法有很大的不确定性(不保证方法中的任务执行完)而且运行代价较高。所以用来回收资源也不会有什么好的表现。
综上:finalize()方法并没有什么鸟用。

二.volatile的作用(瓜子二手车)

猜你喜欢

转载自blog.csdn.net/fortunatelx/article/details/80746806