1. 程式人生 > >Java中靜態變數的適用場景

Java中靜態變數的適用場景

Java類中的靜態變數在程式執行期間,其記憶體空間對所有該類的物件例項而言是共享的,有些時候可以認為是全域性變數。因此在某些時候為了節省系統記憶體開銷、共享資源,可以將類中的一些變數宣告為靜態變數,通過下面的例子,你可以發現合理應用靜態變數帶來的好處:

Java程式碼  收藏程式碼
  1. public class WeekA{  
  2.        static class Data {   
  3.              private int week;  
  4.              private String name;  
  5.              Data(int i, String s) {  
  6.                    week= i;  
  7.                    name = s;  
  8.              }  
  9.        }  
  10.        Data weeks[] = {  
  11.              new Data(1"Monday"),  
  12.              new Data(2"Tuesay"),  
  13.              new Data(3"Wednesday"),  
  14.              new Data(4"Thursday"),  
  15.              new Data(5"Friday"),  
  16.              new Data(6"Saturday"
    ),  
  17.              new Data(7"Sunday")  
  18.        };  
  19.        public static void main(String args[]) {  
  20.              final int N = 10000;  
  21.              WeekA weekinstance;  
  22.              for (int i = 1; i <= N; i++){  
  23.                    weekinstance = new WeekA ();  
  24.              }  
  25.        }  
  26. }  

在上面這段程式碼中,沒有將Data weeks宣告為靜態變數,因此當建立WeekA物件時將會得到10 000個weeks物件的副本,這些物件被儲存在記憶體中,但是weeks物件中的資料卻從來沒有被更改過,而且十分穩定。因此,如果能使所有物件共享該資料物件是個不錯的解決辦法,請看下面的程式碼:

Java程式碼  收藏程式碼
  1. public class WeekB{  
  2.       static class Data {   
  3.              private int week;  
  4.              private String name;  
  5.              Data(int i, String s) {  
  6.                    week= i;  
  7.                    name = s;  
  8.             }  
  9.       }  
  10.       static Data weeks[] = {  
  11.              new Data(1"Monday"),  
  12.              new Data(2"Tuesay"),  
  13.              new Data(3"Wednesday"),  
  14.              new Data(4"Thursday"),  
  15.              new Data(5"Friday"),  
  16.              new Data(6"Saturday"),  
  17.              new Data(7"Sunday")  
  18.       };  
  19.       public static void main(String args[]) {  
  20.              final int N = 10000;  
  21.              WeekB weekinstance;  
  22.              for (int i = 1; i <= N; i++){  
  23.                    weekinstance = new WeekB ();  
  24.              }  
  25.      }  
  26. }      

 請注意在類WeekB中,在Data weeks[]之前添加了static關鍵字,將該物件變數宣告為靜態的,因此當你建立10 000個WeekB物件時系統中只儲存著該物件的一份拷貝,而且該類的所有物件例項共享這份拷貝,這無疑節約了大量的不必要的記憶體開銷,同時實現了要完成的系統功能。

那麼是不是我們應該儘量地多使用靜態變數呢?其實不是這樣的,因為靜態變數生命週期較長,而且不易被系統回收,因此如果不能合理地使用靜態變數,就會適得其反,造成大量的記憶體浪費,所謂過猶不及。因此,建議在具備下列全部條件的情況下,儘量使用靜態變數:

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

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

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

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

如果變數不具備上述特點建議你不要輕易地使用靜態變數,以免弄巧成拙。