2008年4月30日 星期三

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

<<1-5-2>>
非存取的成員修飾子(Nonaccess Member Modifiers)
  • 包含 final、abstract、transient、synchronized、native、strictfp、static。


Final 函式
  • final 關鍵字可以防止函式被子類別覆寫,而且通常被用來當成 API 的一部份。
  • 防止子類別覆寫函式也扼殺了許多 OO 的優勢,包含透過多型達到可擴充性。


Final 引數(Final Arguments)
  • 在函式宣告的括號中出現的變數宣告,就是函式引數(method arguments),函數引數基本上和區域變數一樣,所以可使用 final,例:
    public Record getRecord(int fileName, final int recordNumber) { ... }
    代表 recordNumber 變數在此函式內,不能被修改。


抽象函式(Abstract Methods)
  • 一個 abstract 函式是指該函式已經被宣告了,但還沒被實作,也就是它沒有函式的主體(method body)。
  • 在一個沒有宣告成 abstract 的類別放進一個抽象函式,是不合法的!可是一個抽象類別可不包含任何抽象函式。
  • 第一個抽象類別的具象子類別(concrete subclass)必須實作所有父類別的抽象函式。
    總覺得這段原文敘述有點怪,還是改為以下:
    當一具象類別(concrete subclass)繼承了抽象類別時,此具象類別必須實作所有父類別的抽象函式。
  • abstract 不可和 final、private 和 static 一起使用。
  • public abstract class A {
     abstract void foo();
    }
    class B extends A {
     void foo(int I) { }
    }
    這段程式碼是無法完成編譯的,因為 B 並未實作 A 的 foo() 抽象函式,而 foo(int I) 只是一個多載化函式(overloaded method,一個使用相同的識別字,但不相同的引數的函式)。
Synchronized 函式
  • synchronized 這個關鍵字是指讓函式一次只能被一個執行緒(thread)存取。

Native 函式
  • native 修飾子是指該函式被和平台相關(platform-dependent)的程式碼實作,通常是 C。
  • 只能用於函式,不可用於類別或變數。
  • 必須注意 native 函式的宣告必須以分號來結尾(就像抽象函式),也就是實作是省略的。
Strictfp 函式
  • strictfp 強迫浮點數(和其他浮點數運算)遵循 IEEE 754 的標準。
  • 優點是可確保每個平台所得到的結果是一致的,且可預測。
    缺點是如困底層的平台支援更精準的浮點數運算,則 strictfp 函式將沒辦法使用到此優點。
  • strictfp 可使用於類別及函式,但不可用於變數。

2008年4月29日 星期二

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

  今天差點被 protected 存取控制的文章給逼瘋了,算了,還是自己寫程式測一下吧。結果,好險我有測,否則我已經會錯意了!而且還測了書中沒寫到的狀況,跟我預期的一樣,我將它表列如下:



可見性publicprivatedefaultprotected
同一個類別YesYesYesYes
同一個套件內的任何類別YesNoYesYes
同一個套件內的子類別YesNoYesYes
不同套件的任何非子類別YesNoNoNo
不同套件的子類別YesNoNoYes
不同套件的子孫類別YesNoNoYes
與父不同套件但與子同套件的類別,透過子類別的參考,存取父類別YesNoNoNo
與父同套件但與子不同套件的類別,透過子類別的參考,存取父類別YesNoNoYes


區域變數(Local Variables)和存取修飾子(Access Modifiers)
  • 存取修飾子不可應用在區域變數上。
  • 只有 final 修飾子可應用於區域變數。

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 成員)

2008年4月27日 星期日

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

  第一章都是一些很基本的規則,但是有時也會發現新大陸的感覺,例如識別字可以用$符號,我是第一次聽到,寫那麼久的程式,從來沒有用過。所以,枯燥中也會有一些驚喜!

  不過這個筆記,只是我記錄一些我比較容易忘記細節,並不是全部的課程,所以不一定適合每個人,如果有人跟我一樣想考 SCJP,不應該認為看我的筆記就OK喔!


<<1-2-1>>
合法識別字
  • 識別字須以字母、貨幣符號($)或底線(_)為開頭,不可為數字。
  • 第一個字元之後,可以包含字母、貨幣符號、連結字元(即底線)和數字。
  • 字數沒有上限。
  • 不能使用Java關鍵字。
  • 有區分大小寫。

<<1-2-3>>
JavaBean 屬性命名規則
  • 屬性的型別不是 boolean 時,取值函式的前置字(prefix)必須是get,例:getSize() 為取 "size" 的值,但並不一定需要有 size 這個變數。
  • 屬性的型別是 boolean 時,取值函式的前置字必須為 get 或 is,例:getStopped() 或 isStopped()。
  • 設值函數的前置字必須是 set,例:setSize()。
  • 設值或取值函式必須被標示為 public,格式如下:(屬性名的第一個字要改為大寫)
     設值 >> public void set屬性名(該屬性型別 變數)
         public void setStopped(boolean stopped)
     取值 >> public 該屬性型別 get/is屬性名()
         public boolean getStopped() 或 public boolean isStopped()

JavaBean 的監聽器命名規則
  • 註冊監聽某事件的監聽器函式,必須用前置字 add,再接監聽器的型別,例:addActionListener(),以註冊監聽 Action 事件。
  • 用前置字 remove 來移除註冊監聽某事件,例:removeActionListener()。
  • 用來新增或移除監聽器的型別,必須當引數傳入這個函式。
  • 註冊或移除監聽器的函式,須以"Listener"結尾。

SCJP - 認證序曲

  我的第一個認證目標『SCJP (Sun Certified Java Programmer),考試編號:310-055』。為什麼會選擇它呢?因為,我在業界比較常接觸的就是 Java,之前公司也派我去上過幾次 Java 的相關課程,其中還包含了SCJP的認證課程,但我還是沒去考。現在已經過了幾年,上的內容忘得也差不多了,Java 也從當時1.4到現在的5,其中也有所改變,所以,一切幾乎是要從頭來過,而首先要做的事,當然是去買一本認證專書囉,因此,我就到了天瓏書局找了半天,找到了一本自己覺得還不錯的書,OK,那就從這本書開始吧!

SCJP Java 5 專業認證手冊正面


SCJP Java 5 專業認證手冊背面


參考書籍資訊:
書名:SCJP Java 5 專業認證手冊
出版社:GOTOP 碁峯
作者:Kathy Sierra、Bert Bates 著
   陳逸嘉、高名揚 譯
ISBN 978-986-181-049-2
售價:880元(天瓏打七八折)
版次:2006年08月初版
   2008年03月初版三刷

2008年4月26日 星期六

全新出發 - 為了自己而認證

  我從高職開始接觸電腦,當初會選擇資訊科系,只因為我哥讀得還不錯,自己又不知喜歡什科系,所以就選擇了它。沒想到一讀就讀出興趣來了,讀完高職三年,接著夜二專三年,又夜二技三年,加一加共讀了九年的資訊科系。工作也是,一出社會就是系統開發,至今也有七、八年的工作經驗了。


  那麼長的時間,學過了數不清的技術,也開發了無數的系統,只要有一本工具書,沒有不會的技術。這樣的我,卻半張證照都沒有,之前總是認為「為什麼我要花錢來證明我會這樣技術!」,而且,認證考試費用隨便都是千元起跳,再加上我很討厭考試...,太多的借口讓我一直沒去考,其實就一個字『懶』。

  可是,最近在找工作,才發現證照的重要性,很多企業已經把證照列為求才基本要求,這也讓我失去了很多好的工作機會,縱然有豐富的學經歷,也是枉然。

  這讓我重新思考證照的必要性,Renee 也對我說:「做人要懂得投資自己。」,沒錯!沒有投資,那來的收穫。所以,我決定要執行我的認證計劃,就從現在的這一刻開始!並且,將我的學習過程、心得及筆記,一一記錄在我的blog裡,感覺有一種責任,讓我有持續下去的動力。加油吧!自己!

2008年4月11日 星期五

回來了,我的部落格!

  真是辛苦妳了,回去Google娘家整整快兩個禮拜,跟原本說得四個工作天內,好像有點差距,不過回來就好。

  只能對妳說聲對不起,都是我不好,都是我剛得到妳時太興奮,為了讓妳更美麗,幫妳加了些裝飾品,讓Google娘家以為妳偷人,硬是要妳回娘家檢查,害我不甘寂寞,又新娶了一個部落格(Kevin & Renee @ TAIWAN),真得太對不起妳了!

  雖然妳原本的任務有人取代了,但是妳永遠是我的大房,我會重新思考妳的定位,讓妳重新出發的,相信我!