除了作用域和存储差异外,在Java中,实例变量和局部变量之间还有其他重要的区别吗?
除了作用域和存储差异外,在Java中,实例变量和局部变量之间还有其他重要的区别吗?
我看到的主要区别在于:
作用范围:局部变量仅在声明它们的方法或块中可见,而实例变量可以被类中所有方法看到。
声明位置:局部变量在方法或块内声明,而实例变量在类内声明,但在方法外。
存在时间:当方法调用时,局部变量被创建并在方法退出时被销毁,而实例变量是使用new创建的,并在没有对它们的引用时由垃圾收集器销毁。
访问权限:您无法访问局部变量,而如果将实例变量声明为public,则可以访问。
声明位置:局部变量在调用之前在方法或块中声明,而实例变量可以在类级别的任何地方声明(甚至在使用后)。
实例变量总是有值的,即使代码没有赋值(那么它们将有null、0、0.0和false等值)。对于局部变量,必须通过代码赋值。否则编译器会生成一个错误。
我能想到的另一件事:
实例变量会被赋予默认值,即如果是对象引用,则为null,如果是int,则为0。
而局部变量没有默认值,因此需要显式初始化(如果未能这样做,编译器通常会报错)。
另一个不同之处在于您不必担心对局部变量的并发访问;而在多线程环境中,您需要考虑实例变量的并发访问。
不,你已经几乎概括了它。一个实例变量属于类的一个实例,而局部变量属于堆栈帧。
实例变量被初始化为默认值,但通常最好使用显式初始化。
局部变量:
实例变量:
false
、null
等)。-> 局部变量在方法体中声明,只能从声明点到方法结束时使用。
-> 实例变量在类中声明,但不在任何类方法的主体中声明。此外,实例变量可由类的所有方法访问。
除了已经提到的所有内容,我想指出本地变量对于JVM来说访问速度更快一些。与实例变量相比,JVM需要更多的工作来读取或写入实例变量。
对于当前的HotSpot服务器JVM仍然是正确的,因为这不是VM优化问题。这是由于实例变量在方法之外可见,因此在执行方法时可以从其他线程访问。
本地变量位于堆栈上,但成员变量(实例变量)位于堆上。
主要区别在于实例变量会获得默认值。例如,int 值为零,char 值为 null,但局部变量不会。
您可以保留未初始化的实例变量,但是局部变量必须初始化,否则会出现编译器错误。