定义
变量定义部分所定义的变量被称为类的成员变量,在方法体中定义的变量和方法的参数都被称为局部变量。
成员变量:作为类的成员而存在,直接存在于类中。
局部变量:作为方法或语句块的成员而存在,存在于方法的参数列表和方法定义中。
----------------------------------------------
区别
1.成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及static修饰;两者都可以定义成final型
2.成员变量存储在堆,局部变量存储在栈
3.存在时间不同
4.成员变量有默认值,(被final修饰且没有static的必须显式赋值),局部变量不会自动赋值。
5.当一个过程执行完毕,它的局部变量的值就已经不存在,而且变量所占据的内存也被释放。当下一次执行该过程时,它的所有局部变量将重新初始化。
6.成员变量在应用程序的存活期内一直保持模块级变量和成员变量的值。
-------------------------------------------
堆栈解释
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
----------------------------------------------
so
局部变量在使用前必须被程序员主动的初始化,和此形成对比,系统中的成员变量则会被系统提供一个默认的初始值。所以在语法上,类的成员变量能够定义后直接使用,而局部变量在定义后先要赋初值,然后才能使用。
所有类的成员变量可以通过this来引用。
--------------------------------------------
实例变量和静态变量的区别
静态变量使用static关键字修饰。
静态变量是属于静态存储方式,实例变量(局部变量)是属于动态存储方式
一个变量可由static进行再说明,并改变其原有的存储方式。如下
-----------------------------------------
静态全局变量(静态外部变量)(静态成员变量)
外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,
静态局部变量(静态自动变量)(静态成员变量)(我艹名字真多)
属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
---------------------------------------
1.动态存储方式与静态存储方式的定义
1)所谓静态存储方式是指在程序编译期间分配固定的存储空间的方式;
2)所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。
2.内存中用户存储空间的分配情况(分为三部分)
1)程序区:存放程序语句
2)静态存储区:存放全局变量,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。
3)动态存储区:
存放以下数据:
①函数形式参数。在调用函数时给形参分配存储空间;
②自动变量(未加static声明的局部变量);
③函数调用时的现场保护和返回地址等。
-----------------------------------------
静态局部变量的特点(静态自动变量)
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
(4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜
---------------------------------------
静态全局变量的特点(静态成员变量)
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
------------------------------------------
so
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
-----------------------------------------
操作
但可将局部变量定义成静态的,从而保留变量的值。即使方法结束调用也能保存,只是不能使用,直到下次调用此方法时就可以直接使用了。
为了使过程中所有的局部变量为静态变量,可在过程头的起始处加上 Static 关键字。