我注意到 Java 中没有free
关键字,这让我问为什么。当我创建一个新对象或数组时,该变量的范围是什么?
我熟悉 C++ 和 C。
对象的寿命与 Java 中局部变量的范围无关。例如
File f = new File("a");
f = new File("b");
// variable f is still in scope but the first object can be cleaned up.
或者
private final List<File> files = ...
{
File f = new File("a");
files.add(f);
} // f is out of scope but the object lives on in "files".
范围取决于您创建新变量(或)对象的位置。
如果您创建为实例变量/对象,则它的范围是该实例。
如果您创建为类变量/对象(静态),它的范围是类加载器。
如果您创建为局部变量/对象(静态),则它的范围是该方法。
如果一个对象不可访问,那么它就有资格进行 GC(无论范围如何)。
变量具有标准范围:方法或块(除非它是实例变量)。变量(我的意思是原语或引用)保存在堆栈上,而对象和数组(甚至是原语数组)总是保存在堆上。
对象(数组也是一个对象)当然可以从变量范围传递出去并留在那里。对象只要可以到达就存在(有一种方法可以通过参考图来获取它)。它与范围无关。
另一方面,变量总是存在于范围内。没有办法将它传递到任何地方并进行修改。引用总是传递给方法并作为副本返回。