使用相同的对象名在java中使用for循环创建多个对象以理解finalize方法

使用相同的对象名在java中使用for循环创建多个对象以理解finalize方法,java,object,for-loop,Java,Object,For Loop,我是java新手。在阅读一本关于Java的介绍性书籍的同时,我完成了以下代码,同时阅读了finalize方法 class FDemo{ int x; FDemo(int i){ x=i; } protected void finalize(){ System.out.println("Finalizing " +x) } void generator(int i) { FDemo o= new FDemo(i); } } 现在,在创建对象时,我在新类中遇到了以下问题 int

我是java新手。在阅读一本关于Java的介绍性书籍的同时,我完成了以下代码,同时阅读了finalize方法

class FDemo{ int x;
FDemo(int i){
  x=i;
}
protected void finalize(){ 
 System.out.println("Finalizing " +x)
  }
void generator(int i) {
 FDemo o= new FDemo(i);
 }
}
现在,在创建对象时,我在新类中遇到了以下问题

  int count;

FDemo ob= new FDemo(0);

for (count=1;count<10000000;count++)
ob.generator(count);
int计数;
FDemo ob=新FDemo(0);

对于(count=1;count好的,我将把它分成几个部分

我们如何在for中使用相同名称“o”创建新对象 循环?

因此,您在这里所做的实际上只是将o的引用变量重写/重新分配给不同的FDemo。这会使旧的FDemo为空,并最终被垃圾收集器销毁。(这就是调用finalize()方法的原因)

我们是否必须创建一个新对象,然后在下一次迭代中 在整个循环中丢弃现有对象“o”?

这正是你正在做的,当你重新分配o时,你正在覆盖旧的o

还有,如果我们 不断创建和丢弃同一对象?

这是因为java的垃圾收集器只有在生成大量对象时才会触发。然而,我很惊讶100000人没有这样做

关于finalize(),您必须记住的一点是,它只在对象的垃圾收集中调用。现在,这是一个非常不可靠的过程,实际上不在您的控制范围内。就像@TT.在评论中所说的,不要依赖于此。您编写的程序简单地强制finalize()由于有意生成大量对象,最终将调用方法。这是了解finalize及其工作原理的好方法,但在实践中,这可能不是一个很好的解决方案

还有,如果我们 不断创建和丢弃同一对象

在这个应用程序的生命周期中,您确实创建了1000万个不同的对象,每个对象都被o一个接一个地引用

每次,取消引用的一个都有资格进行垃圾收集,因为它已无法从应用程序访问,垃圾收集器随后调用它的finalize方法

class FDemo{ int x;
FDemo(int i){
  x=i;
}
protected void finalize(){ 
 System.out.println("Finalizing " +x)
  }
void generator(int i) {
 FDemo o= new FDemo(i);
 }
}
我们如何在for循环中使用相同的名称“o”创建新对象

你应该学习一些C语言和指针是如何工作的,Java隐藏了这一点,所以有时候会很奇怪

在Java中,有两种类型的数据:对象(如字符串或FDemo)和原语(如int、char…)

引用原语的变量的工作方式与您预期的相同,每次给它一个新值时,它都会删除上一个值。 引用对象的变量不是这样工作的,它们是指针。指针可以被视为地址。在C(和C++)中更清楚,它们实际上是原语,也可以打印

接下来是变量的生命周期。当您退出声明变量的部分时,它将不再存在(但对象不会自动销毁,我认为这是您练习的目的)。 例如:

public void someMethod() {
    int a = 1;
    // I have access to a
    { // I create a new section, generally, it's use by condition, loop...
        int b = 2;
        // Here I have access to a and b
    } // End of my section
    // b is destroyed, I still have access to a
}
// I'm outside my method, a is destroyed
如果我们不断地创建和丢弃同一个对象,为什么finalize执行1000万而不是1000万

这就是Java垃圾收集器的用途。它是一个用于清理内存的大型系统。它会销毁(调用finalize()方法)所有没有引用它们的指针的对象。它只在您真正需要时才被调用,因为它会使用大量的处理能力(在旧机器中,当垃圾收集器启动时,应用程序可能会冻结)


您的对象非常简单(仅1个基本体),因此它不会占用大量内存。这就是为什么只有在创建1000万个对象时才会调用垃圾收集器的原因。

只是好奇,您是否正在阅读Herbert Schildt的《Java初学者指南》?关于finalize,您需要知道的是,您永远不应该依赖它。@TT。他只是在学习如何使用它,而不是在编写真正的程序这里。@AshwinGupta这是关于finalize唯一需要学习的东西。是的,我正在阅读Java-一本初学者指南@AshwinGuptaYes@Ashwin实际上我第一次从100000开始,但它不起作用,所以我尝试了1000万美元。我在书中读到了关于原语与对象的讨论,但你的解释比书中的文本更有帮助这本书,谢谢