2015-12-02 266 views
0

我是java新手。在阅读关于Java的介绍性书籍时,我阅读了以下代码,并阅读了最终化方法。在java中用for循环创建多个对象使用相同的对象名来理解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); 
} 
} 

现在在创建对象我遇到了我无法理解我们如何在使用相同的名称“O” for循环创建新对象的新类

int count; 

FDemo ob= new FDemo(0); 

for (count=1;count<10000000;count++) 
ob.generator(count); 

以下?我们是否需要创建一个新对象,然后在下一次迭代中放弃整个循环中的现有对象'o'? 另外,如果我们不断地创建和丢弃同一个对象,为什么要最终执行1000万而不是1000?就像我说的,我是一个初学者,这个问题对大多数人来说可能听起来很基本或者很愚蠢,但是如果你能花几分钟的时间回答,我将非常感激。 谢谢

+0

只是好奇,你是否正在阅读Java - Herbert Schildt入门指南? –

+0

你需要知道的关于最终确定的事情是,你永远不应该依赖它。 –

+0

@TT。他只是在学习如何使用它,他并没有在这里写一个真正的程序。 –

回答

0

而且,为什么敲定执行了10万套,但不是1000,如果我们 正在不断创造并丢弃同一对象

你真的在这个应用程序的生命周期创造千万不同对象,其中每一个都依次由o引用。

每一次,去引用的一个就符合垃圾收集,因为它已成为不可访问从应用程序,然后垃圾收集器调用它的完成方法。

0

好的我打算把它分解成几部分。

我们如何使用在相同的名字“O”为 循环创建新对象?

所以,你在这里做的实际上只是重写/重新分配o的引用变量到不同的FDemo。这使旧的空置空,最终被垃圾收集器摧毁。 (这是调用finalize()方法)

我们必须创建一个新的对象,然后在下一次迭代 放弃现有对象“O”整个循环?

那么这是你在做什么,当你重新分配啊,你要覆盖旧的。

另外,为什么最后确定执行了10万套,但不是1000,如果我们 正在不断创造并丢弃相同的对象?

嗯,这是因为java的垃圾收集器只在大量的对象被创建时触发。但是,我很惊讶,100000没有这样做。

你必须记住关于finalize()的东西,它只能在对象的垃圾回收集上调用。现在,这是一个非常不可靠的过程,并不在你的控制范围之内。像@TT一样。在评论中说,不要依赖这个。你写的程序简化强制finalize()方法最终被调用,因为有意地生成了大量的对象。这是了解最终确定及其工作原理的好方法,但实际上这可能不是一个好的解决方案。

+0

是@Ashwin实际上我是以第一次100,000开始的,它没有工作,所以我尝试了一千万 –

0

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

你应该学习一些C以及指针是如何工作的,Java会隐藏它,所以它可能会有些奇怪。在Java中,有2种类型的数据:对象(如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 

为什么最终确定执行了10万套,但不是1000,如果我们不断创造并丢弃相同的对象?

这就是Java的垃圾收集器的目的。这是一个用来清理记忆的大系统。它破坏(调用finalize()方法)所有没有引用它们的指针的对象。只有在真正需要时才会调用它,因为它可以使用大量处理能力(在旧计算机中,垃圾收集器启动时应用程序可能会冻结)。

你的对象非常简单(只有1个原语),所以它没有使用大量的内存。这就是为什么只有当您创建10百万个对象时才会调用垃圾收集器。

+0

我读到了书中的原始对象和对象讨论,但你的解释比书中的文本更有帮助。谢谢 –

相关问题