成員變量和局部變量有什麼區別?

class A
{
int a;//成員變量
public static void main(String[] args)
{
int b;//局部變量
}
}

————————————————————————————————————————————————————————————————————————————————————————

類體由2部分構成:

一部分是變量的定義;

一部分是方法的定義(一個類中可以有多個方法) 在變量定義部分定義的變量叫做類的成員變量,成員變量在整個類中都有效. (全局變量應該是成員變量的俗稱) 在方法體中定義的變量叫做局部變量,局部變量只在定義它的方法中有效. 成員變量又分爲 實例變量 和 類變量(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)允許對構造類靜態局部量賦初值。若未賦以初值,則由系統自動賦以0值。
(4)對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。 根據靜態局部變量的特點,可以看出它是一種生存期爲整個源程序的量。雖然離開定義它的函數後不能使用,但如再次調用定義它的函數時,它又可繼續使用,而且保存了前次被調用後留下的值。因此,當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮採用靜態局部變量。雖然用全局變量也可以達到上述目的,但全局變量有時會造成意外的副作用,因此仍以採用局部靜態變量爲宜
—————————————————————————————————————————————————————————
給讀者一個簡單直白的例子(區別靜態局部變量和動態局部變量):
——————————************************************************************——————————
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。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章