Which statement is true?
A. A class's finalize() method cannot be invoked explicitly.
B. super.finalize() is called implicitly by any overriding finalize() method.
C. The finalize() method for a given object is called no more than once by the garbage collector.
D. The order in which finalize() is called on two objects is based on the order in which the two objects
became finalizable.
这一题应该选什么?不太懂!

解决方案 »

  1.   

    英文还真不好懂!
    我觉得应该是C吧
    对于A:finalize()方法应该是能被显示调用的,比如之类finalize()方法中调用super.finalize()方法
    对于B:好像是如果从写了finalize()方法,就要显示申明调用父类的
    对于D:垃圾回收器并不是一定能调用指定的销毁对象大家指教!
      

  2.   


    答案AD 都是一定不对的。
     A 我们显示的调用 finalize() ,建议JVM进行垃圾回收。
    B 意思是 super.finalize() 这句代码在重写一个对象的super.finalize()都隐式包含这句代码。不知道睁不正确,因为一般来说 我们重写finalize() ,都显式调用这句代码。
    C:一个对象的 finalize() 方法只能执行一次。好像是正确(个人意见是正确的),因为当JVM调用finalize() 后一般都销毁了这个对象,所有不可能再调用它的所有方法。
    D:意思是对象的finalize()的调用顺序是由对象的顺序决定的。这是不对的,JVM的垃圾回收机制是根据很多条件决定的
      

  3.   

    C项的英文没看懂
    选项D的翻译应该是:两个对象被垃圾回收的顺序取决于两个对象被JVM认为是该被垃圾回收的顺序。也就是说当JVM已经判断这两个对象都是可以进行垃圾回收的,
    感觉应该是D
      

  4.   

    个人认为应该选C
    B是不对的,可以证明public class CSDN{class Parent{
    public Parent(){
    System.out.println("parent constructor");
    }
    protected void finalize(){
    System.out.println("parent final");
    }
    } class Child extends Parent{
    public Child(){
    System.out.println("child constructor");
    }
    protected void finalize(){
    System.out.println("child final");
    }
    }public static void main(String[] args){
    new CSDN().new Child();
    System.gc();
    }
    }输出结果为
    parent constructor
    child constructor
    child final
    没有调用super.finalize()