我在运行java编程思想书上一个关于垃圾回收的例子的时候出现了一些疑问。(代码相当短,拜托请耐心看完)
public class TestTermination {
public static void main(String[] args) {
Book b1 = new Book(true) //******************************************
System.gc();
}
}
class Book {
boolean checkedout = false;
Book(boolean checkout) {
checkedout = checkout;
}
void CheckIn(){
checkedout = false;
}
protected void finalize(){
if(checkedout){
System.out.println("Error:checked out!");
}
}
}
理想的情况时会打印出"Error:checked out!",但是没有任何打印出来!!
如果把星号那段改为 new Book(true)就会打印出来"Error:checked out!"
我不明白这是怎么回事,难道有一个对象的引用的和没有引用的有什么区别?
如果有知道的,请回答我一下,为什么会出现这种情况?谢谢了!
public class TestTermination {
public static void main(String[] args) {
Book b1 = new Book(true) //******************************************
System.gc();
}
}
class Book {
boolean checkedout = false;
Book(boolean checkout) {
checkedout = checkout;
}
void CheckIn(){
checkedout = false;
}
protected void finalize(){
if(checkedout){
System.out.println("Error:checked out!");
}
}
}
理想的情况时会打印出"Error:checked out!",但是没有任何打印出来!!
如果把星号那段改为 new Book(true)就会打印出来"Error:checked out!"
我不明白这是怎么回事,难道有一个对象的引用的和没有引用的有什么区别?
如果有知道的,请回答我一下,为什么会出现这种情况?谢谢了!
public static void main(String[] args) {
Book b1 = new Book(true);// ******************************************
b1 = null;
System.gc();
}
}class Book {
boolean checkedout = false; Book(boolean checkout) {
checkedout = checkout;
} void CheckIn() {
checkedout = false;
} protected void finalize() {
if (checkedout) {
System.out.println("Error:checked out!");
}
}
}
如直接的new Book()或一楼的将引用设为null