Java “新”的范围,没有“免费”计数器部分
我注意到Java中没有免费关键字,这让我问为什么。 创建新对象或数组时,该变量的作用域是什么Java “新”的范围,没有“免费”计数器部分,java,garbage-collection,Java,Garbage Collection,我注意到Java中没有免费关键字,这让我问为什么。 创建新对象或数组时,该变量的作用域是什么 我熟悉C++,C. 范围取决于您创建新变量或对象的位置。 如果创建为实例变量/对象,则其作用域就是该实例 如果创建为类变量/对象静态,则其作用域为classloader 如果创建为局部变量/对象静态,则其作用域适用于该方法 如果对象不可访问,则无论作用域如何,它都有资格使用GC。作用域取决于您创建新变量或对象的位置 如果创建为实例变量/对象,则其作用域就是该实例 如果创建为类变量/对象静态,则其作用域
我熟悉C++,C.
范围取决于您创建新变量或对象的位置。 如果创建为实例变量/对象,则其作用域就是该实例 如果创建为类变量/对象静态,则其作用域为classloader 如果创建为局部变量/对象静态,则其作用域适用于该方法如果对象不可访问,则无论作用域如何,它都有资格使用GC。作用域取决于您创建新变量或对象的位置 如果创建为实例变量/对象,则其作用域就是该实例 如果创建为类变量/对象静态,则其作用域为classloader 如果创建为局部变量/对象静态,则其作用域适用于该方法 如果对象不可访问,则无论作用域如何,它都符合GC的条件 变量不包含Java中的对象,它们包含原语值或对象引用重要区别:仅仅因为变量超出范围,并不意味着对象可以被垃圾收集,它可能仍然可以通过其他引用访问 变量的范围与C/C非常相似++ 局部变量的块或方法 对象,用于非静态字段或 用于静态字段的类 对象不再可访问时(不是立即,而是最终)会被垃圾收集。 变量不包含Java中的对象,它们包含原语值或对象引用重要区别:仅仅因为变量超出范围,并不意味着对象可以被垃圾收集,它可能仍然可以通过其他引用访问 变量的范围与C/C非常相似++ 局部变量的块或方法 对象,用于非静态字段或 用于静态字段的类 对象不再可访问时(不是立即,而是最终)会被垃圾收集。
在Java中,对象的寿命和局部变量的作用域关系不大。e、 g
File f = new File("a");
f = new File("b");
// variable f is still in scope but the first object can be cleaned up.
或
在Java中,对象的寿命和局部变量的作用域关系不大。e、 g
File f = new File("a");
f = new File("b");
// variable f is still in scope but the first object can be cleaned up.
或
变量具有标准作用域:方法或块,除非它是实例变量。变量我的意思是原语或引用保留在堆栈上,而对象和数组甚至原语数组始终保留在堆上 对象数组也是一个对象,当然也可以从变量范围中传递出来并保留在那里。只要对象是可到达的,它就存在。有一种方法可以通过引用图到达它。这与范围无关
另一方面,变量始终存在于一个范围内。无法将其传递到任何位置并进行修改。引用总是传递给方法并作为副本返回。变量具有标准作用域:方法或块,除非它是实例变量。变量我的意思是原语或引用保留在堆栈上,而对象和数组甚至原语数组始终保留在堆上 对象数组也是一个对象,当然也可以从变量范围中传递出来并保留在那里。只要对象是可到达的,它就存在。有一种方法可以通过引用图到达它。这与范围无关
另一方面,变量始终存在于一个范围内。无法将其传递到任何位置并进行修改。引用总是传递给方法并作为副本返回。Java已经实现了自动垃圾回收。但是您无法知道它何时被释放。所以,它在时间上也有一个范围!您将对象与变量混淆。而且,这不是java特有的,C和C++有相同的区别,它更重要。新的/免费的内存管理属于范围管理的范畴。@ JoajimSouER是的,虽然这些可以在C++中与RAII一起使用很长的路,但我不会调用任何一个不知道C++程序员的区别的人,一个C程序员甚至不能正确地编写最简单的程序,当然这是偶然的。Java有一个自动垃圾收集。但是你不知道它什么时候被释放。所以,它在时间上也有一个范围!您将对象与变量混淆。而且,这不是java特有的,C和C++有相同的区别,它更重要。新的/免费的内存管理属于范围管理的范畴。@ JoajimSouER是的,虽然这些可以在C++中与RAII一起使用很长的路,但我不会调用任何一个不知道C++程序员的区别的人,一个C程序员甚至不能正确地编写最琐碎的程序,当然这是偶然的。不管存在多少对对象的引用,对象都可以而且应该被收集。只有可达性才重要。无论存在多少对对象的引用,都可以而且应该收集对象。只有可达性才重要。这里也一样:是否有对对象的引用并不重要
提交给总承包商;重要的是对象是否可访问。如果你真的想精确,你应该提到Java中的弱引用、软引用和虚引用。。。这超出了问题的范围。当然,“丰富性”是正确的术语。对于初学者来说,这些区别可以也可能应该被忽略。但是has-reference而不是is-reachable是一种误导,即使对于初学者来说,如果他们足够聪明,能够想到周期的话。环顾四周,GCs是否能够处理这些问题还有很多疑问。我认为我们应该从bat开始正确地解释这一点,以防止误解。这里也是:是否存在对对象的引用对GC并不重要;重要的是对象是否可访问。如果你真的想精确,你应该提到Java中的弱引用、软引用和虚引用。。。这超出了问题的范围。当然,“丰富性”是正确的术语。对于初学者来说,这些区别可以也可能应该被忽略。但是has-reference而不是is-reachable是一种误导,即使对于初学者来说,如果他们足够聪明,能够想到周期的话。环顾四周,GCs是否能够处理这些问题还有很多疑问。我认为我们应该从一开始就正确地解释这一点,以防止误解。