Java中的本地variables和实例variables有什么区别?
除了范围和存储的差异,在java中的实例和局部variables之间是否还有其他的主要区别?
我能想到的另一件事情是:
实例variables被赋予默认值,如果是对象引用则为null,如果是int则为0。
局部variables不会得到默认值,因此需要显式初始化(如果不这样做,编译器通常会抱怨)。
我看到的主要差异在于:
范围:局部variables仅在声明的方法或块中可见,而类中的所有方法都可以看到实例variables。
声明的地方:局部variables在方法或块内声明,而类内的实例variables但在方法外。
存在时间:当一个方法被调用时创build局部variables,当方法退出时被销毁,而实例variables是由新的和垃圾收集器创build的,当没有对它们的引用时被创build。
访问:您不能访问局部variables,而实例variables如果被声明为公共的,则可以被访问。
声明的地方:局部variables在调用之前在方法或块中声明,而实例variables可以在类级别的任何地方声明(甚至在使用之后)。
编辑:
而且我忘了提及实例variables总是有值,即使它没有被代码分配(那么它们将具有例如null,0,0.0,false)。 对于局部variables,代码中必须有一个赋值,否则编译器会产生一个错误。
不,你几乎覆盖了它。 一个实例variables属于一个类的一个实例,一个局部variables属于一个栈帧。
实例variables被初始化为默认值,但通常使用显式初始化是一个好习惯。
另一个区别是,您不必担心并发访问局部variables; 而您在multithreading环境中使用实例variables。
局部variables:
- 在一个方法/构造函数或块内部声明(用大括号括起来)
- 必须在使用前初始化,否则不会编译。
实例variables:
- 是在一个类中声明的。
- 初始化不是强制的:如果省略,它包含默认值(0,0.0,
false
,null
等)
除了这里已经提到的所有内容之外,我想指出的是本地variables对于访问JVM要快一些。 与本地variables相比,JVM有更多的工作要做,以读取或写入实例variables。 对于当前的Hotspot服务器JVM来说,这仍然是正确的,因为它不是一个虚拟机优化问题,而是因为实例variables在方法外部是可见的,因此可以在方法执行时从其他线程访问。
除了上面提到的所有差异之外,我还想指出一点, 实例variables可以有访问修饰符(如private,public,protected等),但是局部variables不会有任何访问修饰符。
主要区别是实例variables获取默认值,如int值get零char获得null,但不是本地variables。 你可以保留未初始化的实例variables,但是由于局部variables必须被初始化,否则你会得到编译器错误。
在方法,构造函数或块中定义的variables被称为局部variables。 该variables将在方法中声明和初始化,并在方法完成时被销毁。
实例variables是类中的variables,但不包括任何方法。 这些variables在类加载时被实例化。
局部variables在方法中声明。
实例variables在类中声明,但不在方法中声明。
局部variables不会得到默认值。 如果在variables初始化之前尝试使用局部variables,编译器会抱怨。
但是,实例variables总是得到一个默认值。 如果您没有明确地为实例variables赋值,那么实例variables仍然有一个值。
整数0
浮点数0
布尔值为false
引用null