成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別

言曌發表於2018-03-03

變數名首寫字母使用小寫,如果由多個單片語成,從第2個單詞開始的其他單詞的首寫字母使用大寫。

如果區域性變數的名字和成員變數的名字相同, 要想在該方法中使用成員變數,必須使用關鍵字this

 

成員變數和區域性變數的區別

成員變數:

1、成員變數定義在類中,在整個類中都可以被訪問。

2、成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在於物件所在的堆記憶體中。

  3、成員變數有預設初始化值。

區域性變數:

1、區域性變數只定義在區域性範圍內,如:函式內,語句內等,只在所屬的區域有效。

2、區域性變數存在於棧記憶體中,作用的範圍結束,變數空間會自動釋放。

3、區域性變數沒有預設初始化值 

在使用變數時需要遵循的原則為:就近原則

首先在區域性範圍找,有就使用;接著在成員位置找。

 

成員變數(俗稱全域性變數,不區分static),又分為兩種

  • 例項變數
  • 類變數(static靜態變數)

 

通過一段程式碼我們便能區分 靜態變數(類變數),例項變數 和 區域性變數 三者的區別

  1. public class Demo {
  2.     /**
  3.      * 成員變數(俗稱全域性變數),//有預設值為0
  4.      *      靜態變數(也稱類變數),帶static的
  5.      *      例項變數,不帶static的
  6.      * 區域性變數 //無預設值,需要初始化
  7.      */
  8.     static int x; //類變數,有預設值為0
  9.     int y ;//示例變數
  10.     public static void main(String args[]) {
  11.         System.out.println(x);//訪問類變數,值=0
  12.         int x=5;//區域性變數,必須初始化
  13.         System.out.println(x);//訪問區域性變數,值=5
  14.         Demo demo = new Demo();//建立例項
  15.         System.out.println(demo.y);//通過例項訪問例項變數,值=0
  16.     }
  17. }

其中成員變數(靜態變數+例項變數)是有預設值的,即預設值=0;而區域性變數沒有。

 

靜態變數

是一個修飾符,用於修飾成員(成員變數和成員函式)。

特點:

1、想要實現物件中的共性資料的物件共享。可以將這個資料進行靜態修飾。

2、被靜態修飾的成員,可以直接被類名所呼叫。也就是說,靜態的成員多了一種呼叫方式。類名.靜態方式。

3、靜態隨著類的載入而載入。而且優先於物件存在

 

弊端:

1、有些資料是物件特有的資料,是不可以被靜態修飾的。因為那樣的話,特有資料會變成物件的共享資料。這樣對事物的描述就出了問題。所以,在定義靜態時,必須要明確,這個資料是否是被物件所共享的。

2、靜態方法只能訪問靜態成員,不可以訪問非靜態成員。

因為靜態方法載入時,優先於物件存在,所以沒有辦法訪問物件中的成員。

3、靜態方法中不能使用this,super關鍵字。

因為this代表物件,而靜態在時,有可能沒有物件,所以this無法使用。

 

什麼時候使用靜態變數?

在程式執行期間,類中的靜態變數其記憶體空間對所有該類的例項是共享的,因此在某些時候,為了節省記憶體空間開銷,共享資源, 我們可以將類中的變數宣告為靜態變數。

但是因為靜態變數生命週期太長,並且不易被系統回收,所有如果使用不合理,就會適得其反,從而造成大量記憶體的浪費。

因此建議在全部符合下列條件的情況下才使用靜態變數:

(1)變數所包含的物件體積較大,佔用記憶體較多

(2)變數所包含的物件生命週期較長

(3)變數所包含的物件資料穩定

(4)該類的例項 有 對該變數包含物件的共享需求

 

作用域問題

1. 類的靜態變數在記憶體中只有一個。靜態變數位於方法區,被類的所有例項共享。靜態變數的生命週期取決於類的生命週期(即類何時被載入和解除安裝)。

2. 類的每個例項都有相應的例項變數。例項變數位於堆區中。例項變數的生命週期取決於例項的生命週期(即例項何時被建立及銷燬)。

3. 假如成員變數(包括靜態變數和例項變數)是引用變數,那麼當該成員變數結束生命週期時,並不意味著它所引用的物件也一定結束生命週期。變數的生命週期
和物件的生命週期是兩個不同的概念。

4. 區域性變數位於棧區,其生命週期取決於所屬的方法何時被呼叫及結束呼叫。

 

總結一下:

區域性變數位於棧區,靜態變數位於方法區,例項變數位於堆區,方法的位元組碼位於方法區,物件本身位於堆區,物件的引用位於棧區。

順便配張圖

成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別

相關文章