2010-01-18 48 views
9

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

+0

复制? http://stackoverflow.com/questions/1794141/java-instance-variables-vs-local-variables – 2010-01-18 18:35:52

+3

“除了差异,有什么区别?” :-)你在寻找什么样的差异?优化和寿命还是别的? – Fredrik 2010-01-18 18:36:45

回答

23

一个额外的东西我能想到的:

实例变量给出的默认值,即空,如果它是一个对象引用,0,如果它是一个int。

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

7

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

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

33

,我看到的主要区别是在他们:

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

声明的地方:局部变量是在方法或块内声明的,而类中的实例变量却在方法外。

生存时间:当一个方法调用中创建和当方法退出,而实例变量时,有他们没有参考使用新的和由垃圾收集销毁创建摧毁局部变量。

访问:您不能访问局部变量,而实例变量如果声明为公共,则可以访问它们。

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

编辑:

我忘了提,实例变量总是具有价值,即使它不是由代码分配(那么他们将有例如NULL,0,0.0,假的)。对于局部变量,代码中必须有一个赋值,否则编译器会产生一个错误。

+0

你打算成为“范围”和“存在时间”和“他们被宣布的地方”之间的区别是什么?另外,我不明白你的“访问”部分的重要性 - 这意味着什么“访问”本地? – danben 2010-01-18 18:46:56

+0

@danben:访问对本地变量没有意义。这就是为什么它与实例变量有所不同。我同意这是一个微不足道的差异,但仍... ...! “宣称的地方”也是如此。至于范围和存在时间(或寿命),它们是完全不同的术语。而且我也忘了再添加一个,我现在要编辑和添加。 – Alex 2010-01-18 18:53:41

0

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

7

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

1

除了这里已经提到的所有内容之外,我想指出的是本地变量对于访问JVM有点快。与本地变量相比,JVM有更多的工作要做,以读取或写入实例变量。对于当前的Hotspot服务器JVM来说,这仍然是正确的,因为它不是虚拟机优化问题,而是由于实例变量在方法外可见并且可以在执行该方法时从其他线程访问的事实引起的。

+0

你能提供证明这是真实的参考吗?我怀疑读取最终局部变量的速度比最终实例字段快。 – user2418306 2016-05-02 07:24:59

0

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

实例变量是类中的变量,但不包含任何方法。这些变量在加载类时被实例化。

+0

实例变量在构造类的实例时实例化。 – EJP 2016-08-07 23:41:01

2

局部变量:

  • 被声明的方法/构造内或块(在大括号)
  • 必须在使用前进行初始化内,否则将不能编译。

实例变量:

  • 是一个类中声明。
  • 初始化不是强制性的:如果忽略,它包含默认值(0,0.0,falsenull等)
1
从上面提到的所有差异

之外,我想指出一个更差实例变量可以具有访问修饰符(如私有,公共,受保护等),但局部变量将不具有任何访问修饰符。

0

局部变量在方法中声明。

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

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

但是,实例变量总是会得到一个默认值。如果您没有明确地为实例变量赋值,那么实例变量仍然有一个值。

整数0

浮点0

布尔值false

引用空

相关问题