1

我注意到 Java 中没有free关键字,这让我问为什么。当我创建一个新对象或数组时,该变量的范围是什么?

我熟悉 C++ 和 C。

4

4 回答 4

4

对象的寿命与 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".
于 2012-08-23T14:04:08.157 回答
3
  1. 变量在 Java 中不保存对象,它们保存原始值或对象引用(重要区别:仅仅因为您的变量超出范围,并不意味着该对象可以被垃圾收集,它可能仍然可以通过其他方式访问参考 )
  2. 变量的作用域与 C/C++ 非常相似
    • 块或方法(用于局部变量)
    • 对象(用于非静态字段)或
    • 类(用于静态字段)
  3. 当对象不再可访问时(不是立即,而是最终),对象会被垃圾收集。
于 2012-08-23T14:04:01.177 回答
0

范围取决于您创建新变量(或)对象的位置。

如果您创建为实例变量/对象,则它的范围是该实例。

如果您创建为类变量/对象(静态),它的范围是类加载器。

如果您创建为局部变量/对象(静态),则它的范围是该方法。

如果一个对象不可访问,那么它就有资格进行 GC(无论范围如何)。

于 2012-08-23T14:02:57.097 回答
0

变量具有标准范围:方法或块(除非它是实例变量)。变量(我的意思是原语或引用)保存在堆栈上,而对象和数组(甚至是原语数组)总是保存在堆上

对象(数组也是一个对象)当然可以从变量范围传递出去并留在那里。对象只要可以到达就存在(有一种方法可以通过参考图来获取它)。它与范围无关。

另一方面,变量总是存在于范围内。没有办法将它传递到任何地方并进行修改。引用总是传递给方法并作为副本返回。

于 2012-08-23T14:04:16.160 回答