FAQ2.13 成員變量和局部變量有什麼區別?java
class A
{
int a;//成員變量
public static void main(String[] args)
{
int b;//局部變量
}
}程序員
————————————————————————————————————————————————————————————————————————————————————————函數
類體由2部分構成: this
一部分是變量的定義; spa
一部分是方法的定義(一個類中能夠有多個方法) 在變量定義部分定義的變量叫作類的成員變量,成員變量在整個類中都有效. (全局變量應該是成員變量的俗稱) 在方法體中定義的變量叫作局部變量,局部變量只在定義它的方法中有效. 成員變量又分爲 實例變量 和 類變量(static靜態變量).操作系統
class One事件
{內存
float x; //x爲實例變量作用域
static int y; //只要有關鍵字static,y爲類變量編譯器
}
————————————————————————————————————————————————————————————————————————————————————————
1.成員變量能夠被public,protect,private,static等修飾符修飾,而局部變量不能被控制修飾符及static修飾;二者均可以定義成final型
2.成員變量存儲在堆,局部變量存儲在棧
3.存在時間不一樣
4.成員變量有默認值,(被final修飾且沒有static的必須顯式賦值),局部變量不會自動賦值
————————————————————————————————————————————————————————————————————————————————————————
先看下面兩段程序:
程序一:
public class Variable
{
int i;
void test()
{
int j=8;
if(j==i)
System.out.println("相等");
else
System.out.println("不相等");
}
public static void main(String[] args)
{
Variable v=new Variable();
v.test();
}
}
程序二:
public class Variable
{
void test()
{
int i;
int j=8;
if(j==i)
System.out.println("相等");
else
System.out.println("不相等");
}
public static void main(String[] args)
{
Variable v=new Variable();
v.test();
}
}
----------------------------------------------------------------------------------------------------------
第一個程序很正常,編譯時不會出錯。第二個程序編譯時會提示以下錯誤:
D:\Program\java\test>javac Variable.java
Variable.java:9: 可能還沒有初始化變量 i
if(j==i)
^
1 錯誤
之因此會出現這樣的錯誤是由於:成員變量有默認值,(被final修飾且沒有static的必須顯式賦值),局部變量不會自動賦值
===========================================================
類體分爲兩部分。變量定義部分所定義的變量被稱爲類的成員變量,在方法體中定義的變量和方法的參數都被稱爲局部變量
java中成員變量和局部變量的區別
1.成員變量能夠被public,protect,private,static等修飾符修飾,而局部變量不能被控制修飾符及static修飾;二者均可以定義成final型
2.成員變量存儲在堆,局部變量存儲在棧
3.存在時間不一樣
4.成員變量有默認值,(被final修飾且沒有static的必須顯式賦值),局部變量不會自動賦值
-------------------------------------------------------------------------------------------------------------
顧名思意了
什麼是局部,方法內部,塊內部都是局部,執行指令退出那個局部,局部變量自動清除
好比方法中,不用說
塊中
{
int i=0; //這是一個局部變量,它的做用範圍就在其中
}
成員變量就會涉及到誰的成員,類的成員?實例的成員?
class A{
int i=0; //實例的成員
static j=1;//類的成員
}
static 的差異,是否依賴於實例而存在
----------------------------------------------------------------------------------------------------------
成員變量:做爲類的成員而存在,直接存在於類中。
局部變量:做爲方法或語句塊的成員而存在,存在於方法的參數列表和方法定義中。
局部變量在使用前必須被程序員主動的初始化,和此造成對比,系統中的成員變量則會被系統提供一個默認的初始值。因此在語法上,類的成員變量可以定義後直接使用,而局部變量在定義後先要賦初值,而後才能使用。
全部類的成員變量能夠經過this來引用。成員變量又分紅倆中類型:實例變量和靜態變量。靜態變量在定義時要使用static關鍵字。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
靜態變量的類型說明符是static。 靜態變量固然是屬於靜態存儲方式,可是屬於靜態存儲方式的量不必定就是靜態變量,例如外部變量雖屬於靜態存儲方式,但不必定是靜態變量,必須由 static加以定義後才能成爲靜態外部變量,或稱靜態全局變量。對於自動變量,它屬於動態存儲方式。 可是也能夠用static定義它爲靜態自動變量,或稱靜態局部變量,從而成爲靜態存儲方式。
由此看來, 一個變量可由static進行再說明,並改變其原有的存儲方式。
1. 靜態局部變量
在局部變量的說明前再加上static說明符就構成靜態局部變量。
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
靜態局部變量屬於靜態存儲方式,它具備如下特色:
(1)靜態局部變量在函數內定義,但不象自動變量那樣,當調用時就存在,退出函數時就消失。靜態局部變量始終存在着,也就是說它的生存期爲整個源程序。
(2)靜態局部變量的生存期雖然爲整個源程序,可是其做用域仍與自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數後, 儘管該變量還繼續存在,但不能使用它。
(3)容許對構造類靜態局部量賦初值。若未賦以初值,則由系統自動賦以值。
(4) 對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予值。而對自動變量不賦初值,則其值是不定的。根據靜態局部變量的特色,能夠看出它是一種生存期爲整個源程序的量。雖然離開定義它的函數後不能使用,但如再次調用定義它的函數時,它又可繼續使用,並且 保存了前次被調用後留下的值。所以,當屢次調用一個函數且要求在調用之間保留某些變量的值時,可考慮採用靜態局部變量。雖然用全局變量也能夠達到上述目的,但全局變量有時會形成意外的反作用,所以仍以採用局部靜態變量爲宜
—————————————————————————————————————————————————————————
給讀者一個簡單直白的例子(區別靜態局部變量和動態局部變量):
——————————************************************************************——————————
int fun(int n)
{
static int f=1; /*請注意這行的修改*/ 這是 static 結果:
f=f*n;
return(f);
}
main()
{
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fun(i));
}
——————————************************************************************——————————
int fun(int n)
{
int f=1; /*請注意這行的修改*/ 結果是:
這是auto 的結果
f=f*n;
return(f);
}
main()
{
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fun(i));
}
————————————————————————————————————————————————————————————————
2.靜態全局變量
全 局變量(外部變量)的說明以前再冠以static 就構成了靜態的全局變量。全局變量自己就是靜態存儲方式, 靜態全局變量固然也是靜態存儲方式。這二者在存儲方式上並沒有不一樣。這二者的區別雖在於非靜態全局變量的做用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其做用域, 即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。因爲靜態全局變量的做用域侷限於一個源文件內,只能爲該源文件內的函數公用,所以能夠避免在其它源文件中引發錯誤。從以上分析能夠看出,把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量 後是改變了它的做用域,限制了它的使用範圍。所以static 這個說明符在不一樣的地方所起的做用是不一樣的。應予以注意。
靜態變量
除 範圍以外,變量還有存活期,在這一期間變量可以保持它們的值。在應用程序的存活期內一直保持模塊級變量和公用變量的值。可是,對於 Dim 聲明的局部變量以及聲明局部變量的過程,僅當過程在執行時這些局部變量才存在。一般,當一個過程執行完畢,它的局部變量的值就已經不存在,並且變量所佔據的內存也被釋放。當下一次執行該過程時,它的全部局部變量將從新初始化。
但可將局部變量定義成靜態的,從而保留變量的值。在過程內部用 Static 關鍵字聲明一個或多個變量,其用法和 Dim 語句徹底同樣:
Static Depth
例如,下面的函數將存儲在靜態變量 Accumulate 中的之前的運營總值與一個新值相加,以計算運營總值。
Function RunningTotal (num)
Static ApplesSold
ApplesSold = ApplesSold + num
RunningTotal = ApplesSold
End Function
若是用 Dim 而不用 Static 聲明 ApplesSold,則之前的累計值不會經過調用函數保留下來,函數只會簡單地返回調用它的那個相同值。
在模塊的聲明段聲明 ApplesSold,並使它成爲模塊級變量,由此也會收到一樣效果。可是,這種方法一旦改變變量的範圍,過程就再也不對變量排他性存取。因爲其它過程也能夠訪問和改變變量的值,因此運營總值也許不可靠,代碼將更難於維護。
聲明全部的局部變量爲靜態變量
爲了使過程當中全部的局部變量爲靜態變量,可在過程頭的起始處加上 Static 關鍵字。例如:
Static Function RunningTotal (num)
這就使過程當中的全部局部變量都變爲靜態,不管它們是用 Static、Dim 或 Private 聲明的仍是隱式聲明的。能夠將 Static 放在任何 Sub 或 Funtion 過程頭的前面,包括事件過程和聲明爲 Private 的過程。
————————————————————————————————————————————————————————————————————————————————————————
1.動態存儲方式與靜態存儲方式的定義
1)所謂靜態存儲方式是指在程序編譯期間分配固定的存儲空間的方式;
2)所謂動態存儲方式是指在程序運行期間根據須要進行動態的分配存儲空間的方式。
2.內存中用戶存儲空間的分配狀況(分爲三部分)
1)程序區:存放程序語句
2)靜態存儲區:存放全局變量,在程序開始執行時給全局變量分配存儲區,程序執行完畢就釋放。
3)動態存儲區:
存放如下數據:
①函數形式參數。在調用函數時給形參分配存儲空間;
②自動變量(未加static聲明的局部變量);
③函數調用時的現場保護和返回地址等。
棧,就是那些由編譯器在須要的時候分配,在不須要的時候自動清楚的變量的存儲區。裏面的變量一般是局部變量、函數參數等。
堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由咱們的應用程序去控制,通常一個new就要對應一個delete。若是程序員沒有釋放掉,那麼在程序結束後,操做系統會自動回收。