Java中的本地变量和实例变量之间的区别是什么

时间:2010-01-18 18:33:55

标签: java

除了范围和存储差异之外,java中的实例和局部变量之间是否还有其他主要区别?

12 个答案:

答案 0 :(得分:37)

我看到的主要区别在于:

范围:局部变量仅在声明它们的方法或块中可见,而实例变量可以被类中的所有方法看到。

声明它们的位置:局部变量在方法或块中声明,而实例变量在类中但在方法外部声明。

存在时间:在方法退出时调用方法时会创建局部变量,而在没有引用时,使用new创建实例变量并由垃圾收集器销毁。< / p>

访问:您无法访问本地变量,而如果将实例变量声明为公用变量,则可以访问它们。

声明它们的位置:局部变量在调用之前在方法或块中声明,而实例变量可以在类级别的任何位置声明(即使在使用之后)。

修改

我忘了提到实例变量总是有值,即使它没有被代码赋值(那么它们将具有例如null,0,0.0,false)。对于局部变量,代码必须有指定的值,否则编译器会生成错误。

答案 1 :(得分:28)

我能想到的另外一件事:

实例变量被赋予默认值,如果它是对象引用则为null,如果是int,则为0。

局部变量没有得到默认值,因此需要显式初始化(​​如果你不这样做,编译器通常会抱怨)。

答案 2 :(得分:9)

另一个区别是,您不必担心并发访问本地变量;而你在多线程环境中使用实例变量。

答案 3 :(得分:8)

不,你几乎涵盖了它。实例变量属于类的实例,局部变量属于堆栈帧。

实例变量初始化为默认值,但通常最好使用显式初始化。

答案 4 :(得分:5)

本地变量:

  • 在方法/构造函数内或块内(用括号括起来)
  • 中声明
  • 必须在使用前初始化,否则无法编译。

实例变量:

  • 在一个类中声明。
  • 初始化不是强制性的:如果省略,它包含默认值(0,0.0,falsenull等。)

答案 5 :(得分:2)

->局部变量在方法主体中声明,可以使用 仅从声明开始到方法结束为止 声明。

->在类中声明实例变量,但在正文中声明实例变量 该类的任何方法。此外,实例变量可供所有人使用 该类的方法。

答案 6 :(得分:1)

除了这里已经提到的所有内容之外,我想指出局部变量访问JVM的速度要快一些。与局部变量相比,JVM需要做更多的工作来读取或写入实例变量。对于当前的Hotspot服务器JVM来说,这仍然是正确的,因为它不是VM优化问题,而是由于实例变量在方法外部可见,因此可以在执行方法时从其他线程访问。

答案 7 :(得分:1)

除了上述所有差异外,我还想指出另一个区别,实例变量可以有访问修饰符(如私有,公共,受保护等),但局部变量没有任何访问修饰符。

答案 8 :(得分:0)

主要区别是实例变量获取默认值,如int value get zero char获取null但不是局部变量。   您可以保留未初始化的实例变量,但必须初始化局部变量,否则会出现编译器错误。

答案 9 :(得分:0)

在方法,构造函数或块中定义的变量称为局部变量。变量将在方法中声明和初始化,并且在方法完成时将被销毁。

实例变量是类中的变量,但在任何方法之外。加载类时会实例化这些变量。

答案 10 :(得分:0)

局部变量在方法中声明。

实例变量在类中声明,但不在方法中声明。

局部变量没有获得默认值。如果在变量初始化之前尝试使用局部变量,编译器会抱怨。

但是,实例变量始终会获得默认值。如果没有为实例变量显式赋值,则实例变量仍具有值。

整数0

浮点0

布尔值false

引用null

答案 11 :(得分:0)

局部变量在堆栈上,而成员变量(实例变量)在堆上。