静态方法的Java实例变量

时间:2015-11-12 13:27:03

标签: java static-methods

静态方法的实例变量什么时候在java中获取内存? 在静态方法中创建实例变量是完全正确的(在参数中或在函数内部声明),但我想知道静态方法的实例变量何时被分配内存,如果没有创建类的对象?

实际上我的意思是说静态方法中的局部变量

4 个答案:

答案 0 :(得分:2)

首先,术语Name - Count(1) Heavy - 2 Light - 1 不准确,我假设您在下面的示例中询问instance variable,例如local variablea

b

在Java中,只有基元和引用存储在堆栈中,对象在构造时存储在堆中。一旦范围结束,就会清理堆栈,堆由垃圾收集器清理。

以下是一个例子:

void method(int a) {
    int b = 3;
}

第一次代码引用public class Main { static A a = new A(); static void method() { int b = 2; C c = new C(); } } 时,类加载器将加载类并初始化其所有静态字段 - 对象Main将进入堆。这里没有更多的事情发生,方法new A()也可能不存在。

当你调用方法method时,它会在堆栈上添加值method,然后它会在堆栈上添加引用2,它将指向对象{{1}在堆中。

当方法存在时,cnew C()将从堆栈中删除(实际上没有删除,但堆栈的顶部更改为下面的两个位置,因此每当这两个值都将被覆盖其他东西进入堆栈),而2将保留在堆中直到垃圾收集器触发。由于GC可能检测到没有对此对象的更多引用,因此很可能会立即对其进行垃圾回收。

答案 1 :(得分:0)

如果在静态方法中声明变量或使用参数,则它不是所有实例变量。它是一个局部变量,一旦调用该方法就会被初始化

static void methodTest(int i) {

String s = "Hello";

}

此处s是该方法的局部变量。 i是函数参数,也是方法的局部变量

答案 2 :(得分:0)

静态方法中没有实例变量这样的东西。

如果你的意思是参数和局部变量,那些就是在堆栈上分配的(像往常一样在堆上分配任何创建的对象)。

加载类时,将初始化类的静态字段。

在构造实例时,将分配(并可能初始化)类的实例变量。

答案 3 :(得分:-3)

静态方法定义的变量仍然是方法范围内的局部变量,就像非静态方法创建局部变量一样。然而,问题是变量永远不会被垃圾收集,只要类加载器(通常是主类,它只是在运行时终止时才会卸载"这就像用你的右手抓你的左耳)没有卸载和垃圾收集。只有当对象不再被引用时,对象才会获得GC,并且在静态字段的情况下,由于我所描述的行为,即使没有使用它们,它们也有被引用的倾向。因此,在内存和资源问题的大型应用程序中,在静态方法中声明任何内容是非常糟糕的,因为很快就会使用无法收集的LOCAL VARIABLES污染内存。