Java 入門指南 V2.00 - 單元 12 - static




類別 (class) 是物件 (object) 的藍圖,從類別製造出的物件可以有很多個,可是類別仍然只有一個



這是說類別在程式執行時就已存在,如果程式中有用 new 及建構子 (constructor) 建立物件,才會有物件存在,所以物件又被稱為實體 (instance) 。凡是宣告為 static 的屬性與方法都屬於類別,而沒有加上 static 的屬性與方法都屬於物件。


基本上, static 方法 (method) 可以存取 static 屬性 (field) ,若要使用非 static 屬性或呼叫非 static 方法就得建立物件實體,我們不是已經看過很多 staticmain() 方法例子了嗎?


static 方法也稱為類別方法 (class method) ,同樣 static 屬性也稱為類別屬性 (class attribute) 。

至於存取 static 屬性或 static 方法則用類別名稱即可,舉例如下


001public class ClassDemo08 {
002   private static int a = 0;
003   private int b;
004
005   public ClassDemo08() {
006      a++;
007      b = 0;
008   }
009
010   public static double test() {
011      return ((double) a / 10);
012   }
013
014   public static void main(String[] args) { 
015      for (int i = 0; i < 10; i++) {
016         ClassDemo08 d = new ClassDemo08();
017         System.out.println();
018         int p1 = ClassDemo08.a;
019         System.out.println(p1);
020         System.out.println(d.b);
021         double p2 = ClassDemo08.test();
022         System.out.println(p2);
023         System.out.println();
024      }
025   }
026}
027 
028/* 檔名: ClassDemo08.java
029   作者: Kaiching Chang
030   時間: September, 2014  */

屬性 a 宣告為 staticstatic 屬性可以直接指派初值


002private static int a = 0;

方法 test() 也宣告為 static


010public static double test() {

下方存取 a 或呼叫 test() 都是用類別名稱


018int p1 = ClassDemo08.a;
021double p2 = ClassDemo08.test();

編譯執行,結果如下



留意 test() 的內容


010public static double test() {
011   return ((double) a / 10);
012}

由於 Java 為強型態的程式語言 (programming language) ,所謂強型態除了要宣告 (declare) 型態 (type) 外,計算結果也都得符合所宣告的型態,此例的 test() 需要回傳 double ,這裡的小括弧加上 double 就是強制將 a/10 的計算結果轉換成 double


這是因為屬性 aint 型態, intint 做除法的結果會是 int ,如果沒有進行強制型態轉換的話,迴圈印出的前 9 個值 0/100 ,後面 1/10 也會是 0 ,要一直到 10/10 等於 1 之後才會是 1


intint 做除法得到 int 是整數除法 (integer division) ,同樣情況也適用在其他整數型態上。

除了除法外,加、減、乘在基本資料型態 (primitive data type) 都會自動進行型態轉換,轉換方向會由儲存範圍小的資料型態轉換成儲存範圍大的資料型態,例如 intdouble 相加,編譯器會自動先把 int 轉換成 double ,變成 doubledouble 結果也會是 double


若是需要由儲存範圍大的資料型態轉換成儲存範圍小的資料型態,就得進行強制型態轉換,不過這會有遺失精確度 (precision) 的問題。

接下來我們開始著手開發一個編密碼的 Encrypt 類別,繼續介紹更多 Java 程式設計的特性囉!


中英文術語對照


類別class
物件object
建構子constructor
實體instance
方法method
屬性field
類別方法class method
類別屬性class attribute
程式語言programming language
宣告declare
型態type
整數除法integer division
基本資料型態primitive data type
精確度precision

重點整理


  1. 宣告為 static 的方法及屬性屬於類別,能直接以類別名稱存取。
  2. 使用關鍵字 new 及建構子建立的物件又稱為實體,實體方法及實體屬性就是沒有用 static 宣告的。
  3. 在運算式前加上小括弧及型態名稱為進行強制型態轉換。
  4. intint 做除法的結果會是 int ,這稱為整數除法。
  5. 基本資料型態在四則運算的時候會自動進行型態轉換。

問題與討論


  1. 為什麼方法及屬性要有類別跟實體之分?
  2. 為什麼要做強制型態轉換?
  3. 基本資料型態的自動進行型態轉換是如何進行的?

the end

沒有留言: