为什么实例变量决定了对象的状态而局部变量却没有

时间:2018-02-14 18:35:14

标签: java

我是初学者。局部变量也是对象的一部分,但它们仍然不决定对象的状态。有什么解释吗?

1 个答案:

答案 0 :(得分:3)

导致误解的问题是错误的断言“局部变量也是对象的一部分”。 (为论证/问题提供的这些事实是不正确的;如果这是真的,那么论证/问题将是有效的。)

但是,局部变量是 NOT 对象的一部分。局部变量仅存在于本地(例如,方法,循环)范围内。当方法/循环范围终止时,局部变量就会停止存在。

(在方法字节码中,变量“存在”只是因为它们是JVM的指令。但是,它们存在的形式不像Java源,这种“存在”不应该与“成为对象“。此方法级别的字节码不是对象定义。”

也就是说,局部变量仅在单个方法调用中存在。无论是否递归地再次调用相同的方法,都将创建一个不同的,不相关的局部变量。由于每个方法范围都是不同的,因此局部变量不能维护跨越方法边界的状态。

考虑一下:

int m (int x) {     // x is a local (parameter) variable
   int a;           // a is a local variable as well
   a = x;
   if (x < 10) {
     m(x + 1);
   }
   return a;
}

// If local variables DO maintain state in the object, and therefor
// across methods calls, this would print 10 as the "last"
// `a = x` line executed is the innermost call, when x = 10.
// (Spoiler: it doesn't print 10..)
System.out.println("A: " + m(7));

// Exercise: modify the above such that `a` is a *member variable*
// aka a *field*. How does the result change?

[闭关是一个轻微的题外话,但这是模拟的魔法。]