1、作用域不同
成员变量的作用域在整个类内部都是可见,可用的;
局部变量的作用域仅限于定义它的方法,不能被其它方法调用;
2、初始值不同
java会给成员变量一个初始值,初始值为0;
java不会给局部变量赋予初始值,必须自己赋值;
3、在同一个方法中,不允许有同名局部变量;
在不同的方法中,可以有同名的局部变量;
4、成员变量和局部变量同名时,局部变量的赋值具有更高的优先级,优先取局部变量的值;
引用自:https://www.cnblogs.com/lavender-li/p/5706964.html
详细参考:https://blog.youkuaiyun.com/tmdlife/article/details/51970897
实例,就是一个真实的对象。比如我们都是“人”,而你和我其实就是“人”类的实例了。实例化就是创建对象的过程,使用new关键词类创建。
WeatherForecastStation station = new WeatherForecastStation();
上面代码做了三件事,
WeatherForecastStation station;//声明一个WeatherForecastStation类型的引用变量,变量名为station
new WeatherForecastStation();//new 一个WeatherForecastStation类型的对象
station = new WeatherForecastStation();//将station引用变量指向的对象实例化
实例.类变量
但由于这个实例并不拥有这个类变量.
因此它访问的并不是这个实例的变量,依然是访问它对应类的类变量.
也就是说, 如果通过一个实例修改了类变量的值, 由于这个类变量并不属于它.
而是属于它对应的类. 因此, 修改的依然是类的类变量.
与通过该类来修改类变量的结果完全相同.
这会导致该类的其它实例来访问这个类变量时也获得这个被修改过的值.(并非专属,是公用的)
上面啰嗦了半天, 不过其内容我们之前已经体验过, 你能明白就行.
下面我写个程序, 定义了一个 Person 类, 在这个 Person 类中定义两个成员变量.
一个类变量: eyeNum
一个实例变量: name
程序通过 PersonTest 类来创建 Person 实例.
并分别通过 Person 类 和 Person 实例来访问实例变量和类变量.
成员变量的初始化和内存中的运行机制
当系统加载类或创建该类的实例时. 系统将自动为成员变量分配内存空间. 并在分配内存空间后, 自动为成员变量指定初始值.
- 增大了变量的生存时间,这将导致更大的内存开销(如果你以后开发Android,大内存开销会让你的APP无情被用户卸载)
- 扩大了变量的作用域,这不利于提高程序的内聚性. (什么是内聚性?)
即使在程序中使用局部变量, 也应该尽可能的缩小局部变量的作用范围.
局部变量的作用范围越小, 它在内存里停留的时间就越短, 程序性能就越好.
因此, 能用代码块局部变量的地方,就坚决不要使用方法局部变量.