正确的说法是: D. 一个对象成为垃圾是因为不再有引用指着它,但是线程并非如此。 解释: A. 一旦一个对象成为垃圾,不一定立刻被收集掉。Java的垃圾收集器是自动运行的,具体的回收时间是由垃圾收集器决定的,它会根据一些策略来确定合适的时机进行垃圾回收。
B. Java 中的 finalize() 方法是在垃圾收集器回收对象之前被调用的,而不是在对象空间被收集掉之后。但是,不建议过度依赖 finalize() 方法来释放资源,因为它的调用时机不确定,并且在现代Java中已经不推荐使用该方法。更好的做法是使用 try-with-resources 或者其他资源管理方式来手动释放资源。
C. finalize() 方法和 C++ 的析构函数是类似的概念,但不是完全一回事情。C++ 析构函数是在对象销毁时被调用,而 Java 的 finalize() 方法是在垃圾回收之前被调用。而且Java中的垃圾回收是由垃圾收集器自动管理的,而C++中需要手动调用析构函数来销毁对象。
D. 正确。在Java中,一个对象被判定为垃圾(不再被使用)的一个重要条件是没有引用指向它。当一个对象不再被任何引用指向时,它就成为垃圾,可以被垃圾收集器回收。但是线程的引用情况和对象不同,线程可以通过栈帧、全局静态变量等方式持有对象的引用,即使没有其他对象引用该对象,线程也可能持有它的引用,所以线程并非如此简单地被垃圾收集器判定为垃圾。