2017年11月2日 星期四

Day1-3 - 宣告類別

1.1 Develop code that declares classes (including abstract and all forms of nested
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
  1. 一個檔案只能有一個public class
  2. 假如有一個public class在某檔案,則此檔案的名稱必須和此public class名稱相同。(ex: public class hat{}, 需存於hat.java檔)
  3. 假如此class是屬於某套件的,則package必須在第一行,且在import statement之前
  4. 假如此calss有import statement,必須存在於package & class declare之間。
  5. 假如沒有package statement,則import statement必須在檔案的第一行
  6. 假如沒有import及package,class declare必須是檔案的第一行
  7. import & package效力遍及整個檔案內的所有類別。也就是說,不可能有一個class分屬不同套件或不同import。
  8. 一個檔案可以有不只一個非public class
  9. 沒有public class的檔案名稱,可以不需要和檔案內的任何class名稱一樣
  10. 一個檔案只能有一個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能做底下三件事
  1. A class能夠建立一個B class的instance (new B())
  2. A class能夠extends B class (意指A為B的subclass)
  3. 根據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;

解決方法
  1. 將兩個class放入同一個package
  2. 將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。

●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,則會亂成一團。因此當只有確定
  1. 實做了所有需要的功能且不希望被修改method
  2. 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範例1:

abstract class Car{
  private double price;
  public abstract void goFast();
}

  • 當method括號後面接的是分號而不是大括號(若出現在class而非interface),要記得此method及class都必須加上abstract(紅字部分)
  • 若將abstract移除,則需改成大括號public abstract void goFast(){}
Abstract範例2:

class Car{
  private double price;
  public void goFast();
}
  • 修改以上程式碼
  1. 改成上面的程式碼(加上兩個abstract)
  2. 將分號改為大括號
Conclusion:
擁有Abstract class的程式碼可以得到多型的好處,益於擁有最佳彈性和extensionality(延展性)

沒有留言:

張貼留言