2011年6月19日 星期日

《最新Java 2 程式設計與SCJP認證》筆記

一.《變數》
參考型別(Reference Data Types):包含字串 陣列 物件
參考型別的變數所儲存的是位址,因此指定運算時複製的是位址而非資料

取得字串長度:x.length()   //1空格占1長度

命名慣例:1.常數:全部大寫,若由多個字所組成,以_分隔
2.變數:以小寫開頭,若由多個字組成,則每個字首應大寫,如newName
3.方法(函式):和變數相同命名方式,但使用動詞-名詞,如goHome
4.類別:應為名詞,第一個字母大寫,若由多個字組成,則每個字首大寫,如TextEditior
5.介面:應為形容詞,第一個字母大寫,若由多個字組成,則每個字首大寫,如Readable

整數型別:
byte:-128~127
short:-32768~32767
char:0~65535


跳脫序列:\b  鍵盤  <- 鍵
\t 鍵盤 Tab 鍵
\n 換行
\f 換頁
\r 歸位
\" 雙引號
\' 單引號
\\ 反斜線


二.《運算式》
前後置運算子差異:
i = 5
j = (i++)+5;
/*
j值為i先與5相加,i本身的值後再加1
故結果為 i=6  j=10
*/
----
i = 5
j = (++i)+5;
/*
i本身的值先+1,j則為i加過後的值再與5相加
故結果為 i=6  j=11
*/

短路式邏輯運算(||與&&):
以|與||為例(同理&與&&)
i = 3
true | (i++ == 4)
/*
執行兩邊的運算式
再做or判斷
故i值為4
*/
----
i = 3
true || (i++ == 4)
/*
當左邊運算式i = 3一為true,便不會再執行右邊的運算式
故i值仍為3
*/

位元邏輯運算子:
當運算式的兩個運算元皆為整數時,則「|」ˋ「&」與「^」此時並非執行布林值運算,而是進行位元邏輯運算

i = 2;   //00000010
j = -2; //11111110

i | j or的運算過程為
00000010
11111110
-----------
11111110
結果為-2

i & j and的運算過程為
00000010
11111110
-----------
00000010
結果為2

i ^ j xor的運算過程為
00000010
11111110
-----------
11111100
結果為-4

位元補數運算子:
i = 2 //00000010
則 ~i = -3 //11111101

三.《流程控制》
條件運算子:
x?a:b
當x為true時,x則為a否則為b

只有5種型別可用於switch:byte char short int enum

case後若為具名的常數,如a ,必須在宣告時即指定初值
如byte a =100
不可byte a
a=100

for-each迴圈(for-in)
for(int i : a)
/*
每次由a陣列中取出一個元素存入i
變數需當場宣告,不可事先宣告,錯誤如
int i;
for(i :a)
*/

for與while
for(int i=1;i<=range;i+=2){
      sum += i;
}
/*
若將i+=2拿掉,則為無窮迴圈,range後的分號需保留
*/

int i=0;
while(i<=range){
      sum +=i;
      i+=2;
}
/*
若將i+=2拿掉,則為無窮迴圈
*/



四.《陣列》
宣告多維陣列時,最左邊維度一定要指名
如int a [] [] = new int [3] []

將參照型別的變數指定為null即可回收該變數

將字串轉為數值:
i = Integer.parseInt(str)



五.《物件導向》
有了成員變數時,即可在主程式中存取物件的成員變數,語法為
物件.成員變數 oldcar.gas

用方法來描述物件的行為:
傳回值型別 方法名稱(參數型別 參數名稱 ...) {...}
參數的用途是將必要的資訊傳入方法中,可留空
因方法表類別的動作,故應以動詞當成方法名稱的首字

方法內若有運算結果,則其結果稱為方法的傳回值,於方法本體中以return傳回資料
傳回值型別 方法名稱(){... return X}

若方法不會傳回任何結果,則將方法型別設為void,便可不加return,或加上return;

陣列可用來建立多個物件

物件回收:
1.強迫釋放參照:將參照型別的變數指定為null
2.將變數指向別的物件:表示往後不再參照到原來的物件
3.參照型別的變數離開有效範圍 *

參數是以傳值方式傳遞,是將值複製給參數
參照型別(字串 陣列 物件)資料的傳遞是以傳參照方式傳遞,是傳位址

使用多重定義時須注意:1.要讓同名方法有不同的簽名,一定要讓參數型別貨數量不同2.參數的名稱及傳回值型別,都不會是簽名的一部分

建構元不能傳回任何值,因此不可註明傳回值型別與void

建構元一定要與類別同名

當為類別定義需要參數的建構元時,Java就不會自動建立無參數的建構元,因此最好再為類別加上一個不需參數的建構元

在建構元中,只有第一個敘述可使用this呼叫其他的建構元,而不能先進行其他動作

若在建構元中所需進行的設定,有一部份在另一個建構元中完全重複,則須以this呼叫
Test(int x,int y){
this(x)
this.y
}
Test(int x){
this.x = x
}

private:只有在成員所屬的類別中才能存取此成員
protected:可在類別本身、子類別、或在同一package中的類別都能存取此成員
public:任何類別都可存取此成員
不加:只有類別本身及同一package中才能存取此成員
static:所有屬於此類別的物件都會共享此成員

為成員變數撰寫存取方法的建議:
1.最好所有成員變數都加上private
2.如使用此類別的程式需透過成員來完成某件事,就由類別提供方法來完成
3.如需修改或取得成員的值,就提供專門存取成員的方法。如需取得成員值,則方法命名為getXxx;如需設定成員值,則方法命名為setXxx
4.若只是提供類別中其他的方法呼叫的方法,則標示為private,以免被類別外部的程式呼叫
5.最好所有建構元都加上public

static初始區塊:可確保在產生物件前,設定static成員
static { i =1; }

類別變數:static成員變數是由同一類別的所有物件所共享,且不須先產生物件,即可透過類別名稱存取
實體變數:非static成員變數是每個物件各自擁有一份,須經建立後方得使用

在static區塊或方法中,不能用到任何非static的成員變數、方法,與this保留字,因非static的成員變數和方法是隨物件產生;而static可不先產生物件即可使用

一旦宣告成員變數為final後,若是static成員變數,則須在宣告同時獲於static初始區塊中設定初值;若非static成員變數,則須在宣告同時或在建構元中設定初值

凡是宣告在方法外的變數(稱靜態或實體變數),都會有預設值
數值類預設值為0;char:'\u0000';boolean:false;物件參照(類別):null

凡是宣告在方法內的變數(稱為區域變數),因無預設值,故須先設定其值

凡是以new配置記憶體空間的物件或陣列,其內的成員變數或陣列元素都具有預設值



六.《字串》

String(char[] value):由value所指的字元陣列建構字串
String(char[] value,int offset,int count):由第offset個元素取出count個字元
String(String original):建立original所指String物件的副本
char[] test = {'a','b','c','d','e','f','g'}
String a = new String(test) //"abcdefg"
String b = new String(test,3,4) //"defg"
String c = new String(b) //"abcdefg"

比對字串內容:a.equals(b) //相等
a.euqalsIgnoreCase(b) //不論大小寫

自動轉型toString()須回String物件,且須加上public

String物件一旦產生後,其內容便無法更改(除非以StringBuffer或StringBuilder更改),即使是連接運算,都是以運算元連接後的字串產生的新String物件為結果

String類別所提供的方法都是傳回一個新的字串,而不是直接更改字串內容

StringBuffer與StringBuilder若有多個執行緒共同存取字串內容,則應使用StringBuffer,否則應使用StringBuilder以得到較高效率



七.《繼承》

class不可多重繼承父類別

為避免某類別中已有建構元可進行各成員變數初始化,使得在子類別的建構員又重新建構一次,因此應將繼承來的成員變數交給父類別處理,子類別只須初始化自己的成員變數

super()用來呼叫父類別的建構元,須寫在建構元內的最前面,才可繼續執行其他敘述

在建構子類別的物件時,一定會先由下往上呼叫其各層父類別的建構元。若建構元內的最前面沒加super,java則會自動加入無參數的super()

overriding改寫:父類別所定義的方法若不符使用,可在子類別中改寫,但傳回值型別須與父類別相同

多形:透過父類別的參照,依據實際指向物件決定呼叫方法的版本

參照的型別決定可以呼叫哪些方法;參照指向的物件決定呼叫哪個版本的方法

子類別所繼承的方法只能維持或放鬆限制

instanceof:用於檢查參照所指向的物件類別
if(a instanceof Circle)
if(a instanceof Integer)
....



八.《抽象類別》

標註為final的類別不能有抽象方法,因final類別無法被繼承

若子類別沒有實作抽象類別中的所有抽象方法,則此子類別須定義為抽象類別

抽象類別的用途在於該類別必須衍生子類別才能產生物件的場合。特別適用於該類別僅是作為提供static方法給其他類別使用、或是須在初始化時自動產生物件的時候

若只是要防止建立特定類別的物件,則應為該類別定義private,且不須參數的建構元



九.《介面》

類別是用來描述實際存在的物件

介面是用來描述某種行為的方式

在介面中只能定義方法的型別(傳回值)及參數型別,不可定義方法本體,這些方法會自動被加上public abstract;參數型別會自動被加上public static finall,因此在宣告時即須指定初值

介面的命名通常會在名稱前面加上"I",其名稱字首為大寫,大多以形容詞命名

類別可繼承多重介面

介面只能繼承其他介面,不可繼承類別



十.《套件》

欲使用套件中的類別時,須以「套件名稱.類別名稱」來使用
image.Circle

若類別是要提供給套件外的其他類別使用,才標示為public
若成員或方法只是提供給同一套件的其他類別使用,則採預設控制
若成員或方法只是提供給同一套件的其他類別使用,且允許衍生類別重新定義或修改內容,則標示為protected
若成員或方法只是提供給同一類別內的其他成員或方法使用,則標示為private


十一.《例外處理》

若在方法中丟出一個例外,則須在方法中「用catch捕捉」或「用throws宣告丟出」。
但若是在catch區塊中丟出,則只能使用throws宣告


十二.《多執行緒》

欲建立多執行緒,須在類別後繼承Thread,並以改寫run()方法來進行此新執行緒負責的工作
class xx extends Thread
啟動執行緒
xx newThread = new xx();
newThread.star();

多執行緒的執行是新、舊流程交錯執行

Runnable介面可讓任何類別建立多執行緒
class xx implements Runnable
啟動執行緒
Thread newThread = new Thread(new xx());
newThread.star();

synchronized區塊用來標示一個同時間只能有一個執行緒的方法
synchronized(){....}

若是synchronized靜態方法,則鎖定的是類別而非物件,因此若要在static方法中設定同步化區塊,則應以類別來指定
synchronized(xx.class){....}

如果同一類別中有多個synchronized方法時,若有執行緒已進入此類別物件的某個synchronized方法,則會造成其他執行緒無法再呼叫同一物件的任一個synchronized方法,除非使用wait()

wait();可讓目前的執行緒進入等待狀態,直到有別的執行緒呼叫同一物件的notify();方法才會繼續執行

沒有留言:

張貼留言