2018-04-30
父母在人生尚有来处,父母去人生只剩归途。
深入变量
一、变量的分类和初始值
1.变量的分类
变量根据定义位置不同而分成两大类
1)成员变量/字段:直接定义在类{}中的变量(方法外)
-
-
-
- 类成员变量(使用static修饰的字段)
- 实例成员变量(没有使用static修饰的字段)
-
-
2)局部(环境)变量:成员变量以外的变量,定义在方法中的变量
-
-
-
- 方法内部的变量
- 方法的形参
- 代码块中的变量,一对{}
-
-
注意:变量的访问是就近原则
2.变量的初始化
-
- 成员变量:默认是有初始值的(看图)
-
- 局部变量:默认没有初始值,所以必须先初始化才能使用
注意:变量必须初始化(赋值)之后才能使用,初始化才是真正的内存分配。
二、变量的作用域和生命周期
- 变量的作用域
变量根据所定义的位置不同也决定了其作用域也是不同的。看变量所在的那对花括号{}
成员变量/字段:在所定义的类中起作用
环境变量:从开始定义的位置开始到紧跟着结束的}之间
2.变量的生命周期
变量的作用域决定了变量的生命周期
变量的生命周期指的是一个变量被创建并被分配内存空间开始,到该变量被销毁并清除其所在内存空间的过程。
-------------------------------------------------------------------------------------------------------------------------
成员变量: 当系统加载类或创建类的实例时,系统会自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。
-------------------------------------------------------------------------------------------------------------------------
三、局部变量的初始化和在JVM中的运行机制
局部变量定义后,必须经过显示初始化才能使用。这意味着定义了局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋值初始值时,系统才会给局部变量分配内存,并将初始值保存到这块内存中。
与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。如果局部变量是基本类型变量,则直接把变量值存放在栈中,如果是引用类型,则存放地址在栈中。
栈内存中的变量无须系统垃圾回收,变量是随方法或代码块的运行结束而结束的。因此,局部变量的作用域是从初始化该变量开始,知道该方法或该代码块运行完成而结束。因为局部变量只保存基本类型的值或对象的引用,因此局部变量所占的内存通常较小。
四、变量的定义和选择
1.考虑变量的生存时间,影响系统(内存)开销
2.扩大了作用域,不利于程序的内聚性。
开发中应尽量缩小变量的作用域,这样在内存中停留时间越短,性能也就越高。
尽量不使用static修饰,一般定义工具方法时或者static方法需要访问的变量,该变量属于类的时候,需要使用static修饰
也不要动不动就使用成员变量,因为存在着线程不安全的问题。