【问题标题】:Creating multiple objects in java with for loop using the same object name to understand the finalize method用for循环在java中创建多个对象使用相同的对象名来理解finalize方法
【发布时间】:2015-12-02 15:07:42
【问题描述】:

我是 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);

我无法理解我们如何在 for 循环中使用相同的名称“o”创建新对象?我们是否必须创建一个新对象,然后在下一次迭代中丢弃整个循环中的现有对象“o”? 另外,如果我们不断地创建和丢弃同一个对象,为什么 finalize 会执行 1000 万而不是 1000?就像我说的,我是一个初学者,对于这里的大多数人来说,这个问题可能听起来很基础,甚至很愚蠢,但如果你能抽出几分钟来回答,我将不胜感激。 谢谢

【问题讨论】:

  • 只是好奇,您在阅读 Herbert Schildt 的 Java-A Beginner's Guide 吗?
  • 关于 finalize 你需要知道的是,你不应该永远依赖它。
  • @TT。他只是在学习如何使用它,而不是在这里编写真正的程序。
  • @AshwinGupta 这是唯一需要了解的关于 finalize 的内容。
  • 是的,我正在阅读 Java - 初学者指南 @AshwinGupta

标签: java object for-loop


【解决方案1】:

另外,为什么 finalize 执行 1000 万而不是 1000,如果我们 不断地创建和丢弃同一个对象

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

每次,被取消引用的对象都符合垃圾收集的条件,因为应用程序无法访问它,然后垃圾收集器调用它的finalize方法。

【讨论】:

    【解决方案2】:

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

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

    在 Java 中,有两种数据类型:对象(如 String 或您的 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 万个对象时才会调用垃圾收集器的原因。

    【讨论】:

    • 我在书中读到了关于 Primitives vs object 的讨论,但你的解释比书中的文字更有帮助。谢谢
    【解决方案3】:

    好的,我将把它分成几部分。

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

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

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

    这正是您正在做的事情,当您重新分配时,您正在覆盖旧的。

    另外,为什么 finalize 会执行 1000 万而不是 1000,如果我们 不断地创建和丢弃同一个对象?

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

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

    【讨论】:

    • 是的@Ashwin 实际上我第一次从 100,000 开始但没有用所以我尝试了 1000 万
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2012-12-01
    • 2011-12-22
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多