類別 (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
沒有留言:
張貼留言