2014年2月19日 星期三

Java 中 static 的觀念

我相信在剛學 Java 的初學者常常會搞不清楚 static 的用途,有時候程式執行結果不對,就隨便加看看,就算過了也不知道為什麼,其實不要說初學者,連老手有時候都會一時搞不清楚的! 畢竟每個程式語言的 static 多少有些微不太一樣。而這次主要介紹的是 Java 的觀念。

我將 static 分為三種大概念並且用以下程式碼來解說:
  1. class Test {
  2.     public static int mValue = 0;

  3.     public Test() {}

  4.     public static void printValue() {
  5.         static int value = 100;

  6.         System.out.println( value );

  7.         value += 100;
  8.     }
  9. }
  10. public class Main {
  11.     public static void main(String[] argv)  {
  12.         Test test1 = new Test();
  13.         System.out.println(test1.mValue);

  14.         Test test2 = new Test();
  15.         test2.mValue  = 10;
  16.         System.out.println(test2.mValue);

  17.         System.out.println(test1.mValue);
  18.     } 
  19. }

一. static 變數在 class 中,你會發現以上程式碼的第 24 行印出的結果竟然會是 10!由此可見在 class 中的 static 變數無論該 class 被 new 出幾次,這個 static 的變數是共用的,因為它只佔據了唯一的記憶體空間。


二. static 的變數或 function 是可以透過 class 直接被存取的,假如我們要直接改 Test 中的 mValue ,可以直接用 Test.mValue = 5; 的方式,直接改變 iValue 的值,而同理,若我們要呼叫 Test 中的 printValue(),可以直接用 Test.printValue(); 的方式,如此便可執行該 function 了。


三. 在 function 中的 static 變數會保留上次執行此 function 後,該變數最後的值,因此假如多呼叫幾次 printValue() 就會發現它印出的值每次都會加 100。



以上便是三個主要的 static 用法,我們常會看到有些 open source 的東西會把 function 宣告成 static,其實主要目的就是那個 function 常被用到,而如果每次要用到都需要 new 出一個物件,實在很浪費資源,因此只要把它宣告成 static 就可以直接呼叫了。 至於要怎麼樣活用 static 就要靠經驗的累積了!

沒有留言:

張貼留言