二、Java面向对象(6)_深入变量

2018-04-30

 

深入变量

 

一、变量的分类和初始值

  1.变量的分类

    变量根据定义位置不同而分成两大类

      1)成员变量/字段:直接定义在类{}中的变量(方法外)

        • 类成员变量(使用static修饰的字段)
        • 实例成员变量(没有使用static修饰的字段)

     2)局部(环境)变量:成员变量以外的变量,定义在方法中的变量

        • 方法内部的变量
        • 方法的形参
        • 代码块中的变量,一对{}              

  注意:变量的访问是就近原则

 

  2.变量的初始化

    • 成员变量:默认是有初始值的(看图)

        

    • 局部变量:默认没有初始值,所以必须先初始化才能使用

  注意:变量必须初始化(赋值)之后才能使用,初始化才是真正的内存分配。

 

二、变量的作用域和生命周期

  1. 变量的作用域   

    变量根据所定义的位置不同也决定了其作用域也是不同的。看变量所在的那对花括号{}

      成员变量/字段:在所定义的类中起作用

      环境变量:从开始定义的位置开始到紧跟着结束的}之间

 

  2.变量的生命周期

    变量的作用域决定了变量的生命周期

    变量的生命周期指的是一个变量被创建并被分配内存空间开始,到该变量被销毁并清除其所在内存空间的过程。

    -------------------------------------------------------------------------------------------------------------------------   

    成员变量:  当系统加载类或创建类的实例时,系统会自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。

    -------------------------------------------------------------------------------------------------------------------------

    

三、局部变量的初始化和在JVM中的运行机制

  局部变量定义后,必须经过显示初始化才能使用。这意味着定义了局部变量后,系统并未为这个变量分配内存空间,直到等到程序为这个变量赋值初始值时,系统才会给局部变量分配内存,并将初始值保存到这块内存中。

    与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。如果局部变量是基本类型变量,则直接把变量值存放在栈中,如果是引用类型,则存放地址在栈中。

  栈内存中的变量无须系统垃圾回收,变量是随方法或代码块的运行结束而结束的。因此,局部变量的作用域是从初始化该变量开始,知道该方法或该代码块运行完成而结束。因为局部变量只保存基本类型的值或对象的引用,因此局部变量所占的内存通常较小。

四、变量的定义和选择

  1.考虑变量的生存时间,影响系统(内存)开销

  2.扩大了作用域,不利于程序的内聚性。

开发中应尽量缩小变量的作用域,这样在内存中停留时间越短,性能也就越高。

尽量不使用static修饰,一般定义工具方法时或者static方法需要访问的变量,该变量属于类的时候,需要使用static修饰

也不要动不动就使用成员变量,因为存在着线程不安全的问题。

猜你喜欢

转载自www.cnblogs.com/sunNoI/p/8973130.html