classes), interfaces, and enums, and includes the appropriate use of package and import
statements (including static imports).
原始檔的宣告規則 (class file declareation rule)
- class declare, import, package
- 一個檔案只能有一個public class
- 假如有一個public class在某檔案,則此檔案的名稱必須和此public class名稱相同。(ex: public class hat{}, 需存於hat.java檔)
- 假如此class是屬於某套件的,則package必須在第一行,且在import statement之前
- 假如此calss有import statement,必須存在於package & class declare之間。
- 假如沒有package statement,則import statement必須在檔案的第一行。
- 假如沒有import及package,class declare必須是檔案的第一行。
- import & package效力遍及整個檔案內的所有類別。也就是說,不可能有一個class分屬不同套件或不同import。
- 一個檔案可以有不只一個非public class
- 沒有public class的檔案名稱,可以不需要和檔案內的任何class名稱一樣
- 一個檔案只能有一個package,但可以有多個imports
類別的宣告和修飾子
- access modifiers : public, protected, private
- non-access modifiers: strictfp, final, abstract
access modifiers可以限制別人如何使用你所建立的class。除了上述三種access modifiers,第四種為default或稱為package存取。這四種access modifiers可以使用在class, method, instance variable(object的state)上。但是,一個class只可以被宣告成public or default,若使用其他兩種則不合理。
套件名稱的命名方法:
Sun建議規則為 - 公司網域名稱反過來+部門or專案名稱
ex: 公司網域: twmp.com 且 專案為替客戶寫的Wallet
則package命名方法: com.twmp.wallet.client
則底下的Utilities class應為 com.twmp.wallet.client.Utilities
類別的存取
class
|
pacakge
|
subclass
(same pkg) |
subclass
(diff pkg) |
world
|
|
private
|
+
|
||||
default
|
+
|
+
|
+
|
||
protected
|
+
|
+
|
+
|
+透過繼承
|
|
public
|
+
|
+
|
+
|
+
|
+
|
(+為可存取) 若A class能夠存取到B class,意指A class能做底下三件事
- A class能夠建立一個B class的instance (new B())
- A class能夠extends B class (意指A為B的subclass)
- 根據B class的access control,A class可以存取B class的某些methods and variables
若A calss無法看見B class(也許B class為private),則B class內的method and variables的access control就不重要,因為A class無法使用任何方式存取那些method and variables。
●Default Access
-只能存取同一pacakge底下的class
ex:
第一個檔案
package A;
class Food{ }
第二個檔案
package B;
import A.Food;
Class Cookie extends Food {}
錯誤訊息
Can't access class A.Food.
Class or interface must be public, in same package, or an accessible member class.
import A.Food;
解決方法
- 將兩個class放入同一個package
- 將Food設定為public
●Public Access
-如果要在不同的package使用這個public class,依然需要import
上述例子修改方式:
第一個檔案
package A;
public class Food{ }
這樣的class可以被所有其他的class instantiated(實體化),且任何一個class可以自由的extends。除非這個class被標記non-access modifier final
Non-access class modifier (非存取類別修飾子)
- 包含final, abstract, strictfp
- 不論class的access control為何,皆可加上這些modifier (ex: class可以有public+final兩個modifier)
- non-access class modifier不能隨意混用。例如strictfp可以和final一起使用,但final不能和abstrct一起使用。
- strictfp表示此class的所有method在使用floating points時都會符合IEEE 754標準。若不使用則method內使用floating points時會和運行的平台有關。不同平台結果可能不同。除了class也可以在method內使用strictfp。
- 不論class的access control為何,皆可加上這些modifier (ex: class可以有public+final兩個modifier)
- non-access class modifier不能隨意混用。例如strictfp可以和final一起使用,但final不能和abstrct一起使用。
- strictfp表示此class的所有method在使用floating points時都會符合IEEE 754標準。若不使用則method內使用floating points時會和運行的平台有關。不同平台結果可能不同。除了class也可以在method內使用strictfp。
●Final class
- 若一個class為Final class,則沒有一個class可以inherent此final class。
- 使用時機:當需要保證此class沒有內部的method可以被override的時候,才會需要標記成final。比如此method implementation很重要,又擔心會被竄改,則final可以保護這些method,確定沒有人可以更改此實作。
抽象類別(Abstract Classes)
- 舉例來說,Java核心程式庫內,String就是一個final class,所以String不能被inherent。假如其他developer能夠自由繼承String class,則會亂成一團。因此當只有確定
- 實做了所有需要的功能且不希望被修改method
- class不需要被其他人改進或specialized(特殊化)
- 反例來說,如果發現某class內的method有問題,但因為沒有原始碼,則可以透過extends此class來override這個method,但若此class為final則不能修改。
- 基本上不太會需要寫final class,因為少了OO的優勢-extensibility(可擴展性),因此請假設未來寫的程式都需要extend class。
●Abstract class
- 一個abstract class永遠不能被instantiated(實體化產生物件)
- abstract class存在的意義就是要被extends(太抽象了,需要被實作)
- 即使class內只有一個method是abstract,整個class都必須宣告為abstract,一個抽象函式就會影響到它所屬的類別
- 可以將concrete(具象化)的method放入abstract class中,使得subclasss能夠extends這些method的implementation,讓subclass取得這些method功能,只需要implement自己獨特的行為即可(specialized(特殊化))。
- 不能同時將class標示成abstract和final,因為他們功能幾乎相斥。
- 可以在abstract class內加入public static void main(String[] args)..當作入口
- 可以在abstract class內加入public static void main(String[] args)..當作入口
Abstract範例1:
abstract class Car{
private double price;
public abstract void goFast();
}
private double price;
public abstract void goFast();
}
- 當method括號後面接的是分號而不是大括號(若出現在class而非interface),要記得此method及class都必須加上abstract(紅字部分)
- 若將abstract移除,則需改成大括號public
abstractvoid goFast(){}
Abstract範例2:
class Car{
private double price;
public void goFast();
}
class Car{
private double price;
public void goFast();
}
- 修改以上程式碼
- 改成上面的程式碼(加上兩個abstract)
- 將分號改為大括號
Conclusion:
擁有Abstract class的程式碼可以得到多型的好處,益於擁有最佳彈性和extensionality(延展性)
沒有留言:
張貼留言