使用相同的对象名在java中使用for循环创建多个对象以理解finalize方法
我是java新手。在阅读一本关于Java的介绍性书籍的同时,我完成了以下代码,同时阅读了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
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万美元。我在书中读到了关于原语与对象的讨论,但你的解释比书中的文本更有帮助这本书,谢谢