Java – 物件導向 – static

回顧之前


回到學習Java的第一個程式Hello, World

public class HelloWorld {

  public static void main(String[] args) {
    System.out.println("Hello, World");
  }

}

現在看起來, 應該是很簡單的程式. 但是回顧一下物件導向中學習到的觀念, 這是一個HelloWorld的類別, 在這個類別中, 有一個方法, 名稱為main, 沒有傳回值(void), 傳遞參數為字串陣列(String[] args), 存取修飾字為public, 但是有一個static的修飾字的作用何在呢? 再來, System.out.println(…), System就是在API中, 如下圖:

System.out 將會回傳一個 PrintStream 的物件實體, 可是這也是一個static 的修飾字.

再看看之前使用過的 Math.random() 將會回傳一個範圍在大於或等於0.0, 且小於1.0之間的亂數, 其API文件如下圖:

又看到static的修飾字.

 

特性


在不需要文言文式的解說下, 從以上兩個例子中, 至少可以歸納出以下特性:

  • 沒有在 new 出物件實體.
  • 直接以類別名稱呼叫使用

HelloWorld類別程式, 被直接執行起來, 並沒有看到程式中有哪一段程式在 new HelloWorld() 的動作, 也沒有看過 new Math(). 而通通都是直接以該類別名稱來下呼叫執行.

在物件導向中 類別的觀念, 是可以定義出該類別產生出物件實體時的屬性(field)或是方法(method). 這些類別的屬性或是方法都是屬於產生出來的物件實體所擁有的成員(member). 也就是之前看到Bike(腳踏車)類別中的速度(speed)與加速(upSpeed), 減速(downSpeed)等這些成員. 要先有腳踏車(Bike)的物件實體, 才可以呼叫使用的屬性及方法.

在類別中的屬性及方法, 如果加上了static的修飾字, 該屬性或是方法, 就不屬於特定的物件實體了. 而是屬於該類別整體的, 也可以說是類別所擁有的成員(屬性或是方法), 這樣的屬性及方法不需要有特定的物件, 就可以呼叫執行. 因此, 如下方是呼叫:

  • 類別名稱.static屬性
  • 類別名稱.static方法名稱(參數)

也因為如此, 切記, 在static的方法中, 不可以出現this的關鍵字. 因為this是用在指本類別所產生的物件實體, 而在static中的立場及角度上, 只有類別, 並沒有物件, 所以不僅僅是不可以有this, 也無法呼叫物件的屬性及方法, 也就是非static的屬性及方法, 因為不合理.

 

應用範例


還是在Bike腳踏車類別打轉. 在前面的建構式單元中, 了解了一個特性, 建構式對於一個物件實體而言, 只會在 new 出物件實體的時候被執行一次, 從此之後再也與建構式一點關係都沒有. 於是來利用建構式計算出產生了幾個Bike的物件實體, 這樣的計數器, 是屬於整個類別的共同擁有的屬性, 是用來計數出該類別已經產生出幾個物件實體.

// 腳踏車的設計圖
public class Bike {
  protected double speed;	// 速度 => 存取修飾字改為 protected
  private static int counter;	// 類別級別的屬性 static
  // 定義建構式
  Bike(){
    System.out.println("Bike()");
    counter++;
  }
  public static int getCounter() {
    return counter;
  }
}
  • counter 是用來計數, 每當建構式被呼叫, 就表示已經 new 出一個 Bike 的物件實體, 因此進行 counter++.
  • 在應用程式中, 隨時想要知道目前已經 new 出了幾個  Bike 的物件實體, 就可以透過呼叫 Bike.getCounter() 的傳回值得知.
  • counter 的類別級別屬性, 被設定為 private, 是因為要將其進行封裝, 確保只有在建構式被呼叫時, 才會進行 counter++, 而沒有其他機會會被變更其值.

 

另外, 相關應用的範例, 在台灣身分證類別範例中實現.

 

 

本站資源一切隨緣,
不用註冊, 不看廣告
如果對您有所助益,
歡迎功德隨喜, 金額隨意,
請點擊以下...(感謝您)

功德箱/打賞箱

%d bloggers like this: