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

這是說類別在程式執行時就已存在,如果程式中有用 new 及建構子 (constructor) 建立物件,才會有物件存在,所以物件又被稱為實體 (instance) 。凡是宣告為 static 的屬性與方法都屬於類別,而沒有加上 static 的屬性與方法都屬於物件。
基本上, static 方法 (method) 可以存取 static 屬性 (field) ,若要使用非 static 屬性或呼叫非 static 方法就得建立物件實體,我們不是已經看過很多 static 的 main() 方法例子了嗎?
static 方法也稱為類別方法 (class method) ,同樣 static 屬性也稱為類別屬性 (class attribute) 。
至於存取 static 屬性或 static 方法則用類別名稱即可,舉例如下
| 001 | public 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 宣告為 static , static 屬性可以直接指派初值
| 002 | private static int a = 0; |
方法 test() 也宣告為 static
| 010 | public static double test() { |
下方存取 a 或呼叫 test() 都是用類別名稱
| 018 | int p1 = ClassDemo08.a; |
| 021 | double p2 = ClassDemo08.test(); |
編譯執行,結果如下

留意 test() 的內容
| 010 | public static double test() { |
| 011 | return ((double) a / 10); |
| 012 | } |
由於 Java 為強型態的程式語言 (programming language) ,所謂強型態除了要宣告 (declare) 型態 (type) 外,計算結果也都得符合所宣告的型態,此例的 test() 需要回傳 double ,這裡的小括弧加上 double 就是強制將 a/10 的計算結果轉換成 double 。
這是因為屬性 a 為 int 型態, int 跟 int 做除法的結果會是 int ,如果沒有進行強制型態轉換的話,迴圈印出的前 9 個值 0/10 為 0 ,後面 1/10 也會是 0 ,要一直到 10/10 等於 1 之後才會是 1 。
int 跟 int 做除法得到 int 是整數除法 (integer division) ,同樣情況也適用在其他整數型態上。
除了除法外,加、減、乘在基本資料型態 (primitive data type) 都會自動進行型態轉換,轉換方向會由儲存範圍小的資料型態轉換成儲存範圍大的資料型態,例如 int 跟 double 相加,編譯器會自動先把 int 轉換成 double ,變成 double 加 double 結果也會是 double 。
若是需要由儲存範圍大的資料型態轉換成儲存範圍小的資料型態,就得進行強制型態轉換,不過這會有遺失精確度 (precision) 的問題。
接下來我們開始著手開發一個編密碼的 Encrypt 類別,繼續介紹更多 Java 程式設計的特性囉!
中英文術語對照
| 類別 | class |
| 物件 | object |
| 建構子 | constructor |
| 實體 | instance |
| 方法 | method |
| 屬性 | field |
| 類別方法 | class method |
| 類別屬性 | class attribute |
| 程式語言 | programming language |
| 宣告 | declare |
| 型態 | type |
| 整數除法 | integer division |
| 基本資料型態 | primitive data type |
| 精確度 | precision |
重點整理
- 宣告為 static 的方法及屬性屬於類別,能直接以類別名稱存取。
- 使用關鍵字 new 及建構子建立的物件又稱為實體,實體方法及實體屬性就是沒有用 static 宣告的。
- 在運算式前加上小括弧及型態名稱為進行強制型態轉換。
- int 跟 int 做除法的結果會是 int ,這稱為整數除法。
- 基本資料型態在四則運算的時候會自動進行型態轉換。
問題與討論
- 為什麼方法及屬性要有類別跟實體之分?
- 為什麼要做強制型態轉換?
- 基本資料型態的自動進行型態轉換是如何進行的?
the end
沒有留言:
張貼留言
0.留言請選擇註冊帳號, Google 或 OpenID 均可
1.歡迎留言交流,但不歡迎垃圾留言及廣告留言
2.文章相關問題歡迎提出,請減少情緒性留言
3.非文章相關內容,請到 G+ 社群或 FB 社團提出
4.問作業之留言會被直接刪除
5.莫忘網路禮節
6.可使用部份HTML標記,如 <b> 、 <i> 、 <a>
7.站長保留刪除留言的權力