2008年4月28日 星期一

SCJP - 自修重點筆記與心得 (2)

  哇!今天看的內容讓我的頭很痛,痛不是因為看不懂,是筆記很難寫,主要都是在說明存取修飾子(預設、public、protected、private)在什麼情況下可以被別人存取。我想明天要將這些存取規則列一張表,會比較清楚一點。


<<1-3-1>>
原始檔的宣告規則
  • 每個原始檔中只能有一個 public 類別。
  • 註解沒有限制位置。
  • 如困檔案中有一個 public 類別,則此檔名必須與 public 類別名稱相同;若沒 public 類別,則檔名沒有限制。
  • package 必須出現在第一行,且在 import 之前。
  • import 必須存在於 package 與類別宣告之間;若沒有 package 陳述式,則 import 必須在第一行;若沒有 package 與 import,則類別宣告必須在第一行。
  • package 和 import 陳述式的效力,遍及檔案內的所有類別。
  • 一個檔案可以有多個不為 public 的類別。


<<1-3-2>>
類別的宣告和修飾子
  • 類別宣告之前可加上修飾子,如下:
    1. 存取修飾子(access modifiers):預設、public
    2. 非存取修飾子(Non-access modifiers):strictfp、final、abstract

存取修飾子
  • 雖然存取修飾子有三種,但卻有四種存取控制,其中有兩種可用於類別的宣告上。
    1. public → 均可看到;可用於類別、函式、變數。
    2. private → 只有自己可看見;可用於函式、變數。
    3. protected → 只有同一套件內或子類別可見;可用於函式、變數。
    4. 預設 → 只有同一套件內可見;可用於類別、函式、變數。

非存取類別修飾子
  • strictfp
    1. 只可用於類別及函式。
    2. 類別若標記成 strictfp 的意思是,屬於此類別的所有函式使用浮點數(floating pointes)時,均符合 IEEE 754 標準。
    3. strictfp 也可只宣告於某函式。
    4. 若沒有使用此修飾子,則函式內操作浮點數的方式,就有可能和平台相關,行為就可能不一樣。
  • final
    1. 當類別被宣告為 final,則表示沒有其它類別可再成為它的子類別。例:String。
    2. 身為一個 final 類別,就少了一個 OO 的關鍵優勢~可擴展性(extensibility)。
  • abstract
    1. 不可與 final 合用,因為會產生矛盾。
    2. 一個 abstract 的類別,永遠都不能被實體化(instantiated),它唯一的目的,就是被擴充(繼承,和 final 相反)。
    3. 當類別內只要有一函式被宣告為 abstract,則此類別就必須宣告為 abstract 的類別。

<<1-4-1>>
宣告介面
  • 介面只說明一個類別可以做甚麼,但並不包含說明要如何做。
  • 所有的介面函式都隱含著 public 和 abstract,所以不需要再加此兩種修飾子。
  • 介面只能宣告常數(default 為 public static final),不能是實體變數(instance variables)。
  • 介面函式不可為 static,且函式是抽象的,所以也不能標註 final、strictfp 或 native。
  • 一個介面可以擴充(繼承)一個或多個其他介面,但不可擴充其它非介面的東西。
  • 介面不可實作,且使用 interface 來宣告。
  • 介面型別可以被多型地使用 (can be used polymporphically)。

<<1-4-2>>
宣告介面常數
 介面常數必須宣告為 public static final,但因介面內的變數宣告均為 public static final,所以可以省略,例:int BAR = 42;

<<1-5-1>>
類別成員的宣告
存取修飾子
  • 類別只能使用四種存取等級中的兩種(預設或 public),但成員(members,函式及變數)可以使用全部(預設,public,protected,private)。
  • 存取控制議題可分為兩種:
    1. 一個類別內的函式是否可以存取另一類別的成員。
    2. 一個子類別是否可以繼承它的父類別的成員。

公開成(Public Members)
  • 若成員被宣告為 public,則所有其他類別,不論是否在同一套件內,均可以取此成員。
  • 子類別可完全繼承父類別的所有公開成員,並且可直接使用這些成員,例:父類別有一doThings()函式,子類別可直接呼叫 doThings(),而此成員是暗中透過 this 這個參考來取用,也可寫成 this.doThings(); (this 是指目前正在執行這段程式碼的物件)。

私有成員(Private Memebers)
  • 除了它所屬的類別外,沒有其他類別可以取用。
  • 子類別亦無法繼承父類別的私有成員,當在子類別宣告一個與父類別私有成員一樣名稱的成員是合法的,但這不是覆寫函式

預設成員(Default Members)
  • 只有同一套件內之類別函式可存取,沒有例外。

保護成員(Protected Members)
  • protected 和預設存取控制等級幾乎是相同,但有一關鍵點不同,就是保護成員除了只能讓同套件內的類別存取外,也可以被子類別存取,即使這個子類別在另外一個套件內。而且非一套件的子類別只能透過繼承的方式來看到 protected 成員(不能透過實體操作)。
  • 一但有套件之外的子類別繼承了這個 protected 成員,這個成員對其他的子類別之外的而言,就是 private 的了,但不包含這個子類別的子類別們。(實際測試有一個例外,就是當某一類別與父類別同一套件,與子類別不同套件,可是此類別可以透過子類別的參考存取父類別的 protected 成員)

沒有留言: