31、由封裝對象轉換為基礎資料型別 (Elementary Data Type):obj.XXXValue();obj為封裝類的對象,XXX為該封裝對象所表示的
基礎資料型別 (Elementary Data Type)。
32、由字串轉換為基礎資料型別 (Elementary Data Type):obj.parseXXX(String str);obj是封裝類的對象,XXX為該封裝對象
所表示的基礎資料型別 (Elementary Data Type)。
33、由字串轉換為封裝對象:obj.valueOf(String str)。
34、由封裝對象轉換為字串:obj.toString()。
35、由基礎資料型別 (Elementary Data Type)轉換為字串:obj.toString(XXX value)。
36、不等於:!=
37、運算子instanceof,如v1 instanceof v2。檢查對象v1是否為class v2的一個執行個體。
38、邏輯運算子兩邊的式子需屬於boolean。與C++不同,C++中,0之外的整數都視為true。
39、位(Bitwise)邏輯運算子: & ,v1 & v2。位AND,若相對位都為1,則1,否則0
| ,v1 | v2。位OR,若相對位都為0,則0,否則1
^ ,v1 ^ v2。位XOR,若相對的位有相同值,則0,否則1
~ ,~v1。v1的補碼,1變成0,0變成1。
v1和v2需屬於整數類型。
40、Java不支援操作重載,也不支援C++的::和>>以及<<運算子。
41、常量的指定:static final int NUM =1。
42、數組定義:int num []; or int [] num; num=new int [15]; or int [] num=new num[15]; or int
num[]={1,2,3,4,5};
43、若二維數組的第2維的長度不同,由於陣列變數本身是參考類型,可將第1維指向另一個數組。
44、複製數組:void arraycopy(Object src,int srcPosition,Object dest,int destPosition,int
length) or clone() for example int [] newA=(int [])A.clone();
45、Arrays類提供的一些數組運算,如排序和搜尋
static void sort(dataType[] data):將數組data內的元素由小到大排列(使用quicksort)
static void sort(dataType[] data,int fromIndex,int toIndex)
static int binarySearch(dataType[] data,dataType key):利用二進位搜尋的方式搜尋數組data
(必須事先排過序)內的元素key。若搜尋到,則返回key在data中的位置;若無法找到,傳回值為(-插
入點-1),插入點(insert point)為第一個大與所要搜尋元素值的索引。
static void fill(dataType[] data,dataType val):將數組內的各元素設定為val。
static void fill(dataType[] data,int fromIndex,int toIndex,dataType val)
46、在Java中,char數組及String類並不以'/0'為結尾。char數組並不等於String對象,數組是可變的,
但String對象是不變的。
47、將char數群組轉換成一個String對象。char[] data={'s','t','r','i','n','g'};String str=new
String(data);
48、length()得到一個字串的長度,而length可用來得到一個數組所含元素的數目。
49、由於Java的對象為參考型別,因此,string1==string2,只是比較變數string1和string2是否指向
同一個地址,並不會比較字串的內容。
50、int compareTo(String str):s1.compareTo(s2)。若s1和s2相等,則返回0;若s1>s2,則傳回值大於
0;若s1<s2,則傳回值小於0。
int compareToIngnoreCase(String str):s1.compareToIngoreCase(s2)。忽略大小寫。
boolean equals(Object obj):s1.equals(s2)。
boolean equalsIgnoreCase(String str):s1.equalsIgnoreCase(s2)。
51、搜尋和讀取部分字串的操作:
boolean startsWith(String str):檢查str是否在字串的最前面
boolean endsWith(String str)
int indexOf(char ch):得到ch第一次在字串中出現的位置,若無法找到則返回-1
int indexOf(String str)
int lastIndexOf(char ch):由後面開始搜尋,得到ch第一次在字串中出現的位置,若無法找到返
回-1
int lastIndexOf(String str)
String substring(int begin):產生一個新的字串,它包含原有字串位置begin至最末端的所有
字元
String substring(int begin,int end)
52、StringTokenizer(String str):使用預設的分界符來分析一個字串,它們分別為:'','/t','/n'
,'/r','/f'。
StringTokenizer(String str,String delimiter):使用所指定的delimiter來分析字串
53、StringBuffer類是用來產生字串緩衝區,這種字串稱為可變字串。StringBuffer對象的預設容
量是16個字元。
54、StringBuffer無法像String對象一樣直接將字串指定給StringBuffer對象,例如StringBuffer
myString3="this is worong"。必須使用new產生StringBuffer對象。
55、StringBuffer對象有容量和長度之分,容量是不變的,長度是可變的。長度小於等於容量,表示實際
儲存的字元數目。
56.int capacity():返回StringBuffer對象的容量。
int length():返回StringBuffer對象的長度。
StringBuffer append(dataType data):將data加入StringBuffer對象後面
StringBuffer insert(int offset,dataType data):將data插入到offset位置前
String toString():將StringBuffer對象轉換為String對象。
57、當儲存的字串長度超過其容量,容量會改為原來容量的兩倍加上2。預先指定足夠的容量效率較高
58、資料成員代表類內所聲明的變數,分為static(類變數)和non-static(執行個體變數)
59、類內的方法分為static(類方法)和non-static(執行個體方法)
60、每個對象都有一個屬於自己的執行個體變數和變數值,通過對象來存取執行個體變數。
61、每個類 只有一個類變數,屬於該類的對象會共用類變數。不需要通過對象來存取類變數。
62、一個static方法只能存取類的static資料;一個static方法只能存取類的static方法;無法在算他題
詞方法中使用this;一個static方法無法被非static方法所替代。
63、建構函式並沒有傳回值,它需和所在的類同名,如果所用的類並沒有建構函式,Java編譯器會自動生
成一個預設建構函式(不含參數)。
64、Java中,new是不可省略的,使用new表示該變數的記憶體是動態分配的,但必須記得將該記憶體釋放掉。
65、基礎資料型別 (Elementary Data Type)將其值存放在堆棧中,而引用資料類型是將其引用存在堆棧中,但其所引用的對象則是
存在堆(heap)中。
66、Java有引用資料類型和基礎資料型別 (Elementary Data Type),但只有一種傳遞方法,即通過數值傳遞(pass-by-value),
並沒有通過引用傳遞(pass-by-reference)。方法接收到的是一份原來值的複製,對於基礎資料型別 (Elementary Data Type),
所接收到的是一份該資料值的複製;而對於引用資料類型,所接收到的是一份該引用值的複製,而不是該
引用本身。
67、如果要在Java中達到像C/C++的通過引用傳遞的效果,一個辦法是把數組作為參數。
68、除了聲明為private的資料成員外,同一個包的類可以繼承其他所有的資料成員,而其他包的類可以
繼承public和protected的資料成員。這些準則適用於所有的資料成員(類或執行個體變數),同時也適應於
方法,但父類的建構函式並不會被繼承。對定義為final的成員也無法被繼承。
69、在使用方法重載時無法在同一個類中聲明簽名(方法名、參數數目、參數類型)相同但傳回值不同的
方法。
70、將方法重載稱為靜態方法綁定或先期綁定,這是由於在編譯時間編譯器會根據參數的類型和數目來決定
調用哪個方法,而不是在執行時決定。
71、可以將許多的類放在同一個檔案中,但只能有一個類聲明為public,其他的類稱為輔助(helper)類
,輔助類也可包含main(),但會被忽略。
72、以下情況,此類必須聲明為abstract:
該類有一個或超過一個abstract方法(聲明但沒有定義的方法)
該類從一個abstract類繼承一個或超過一個abstract方法,但沒有提供這些方法的實現方法
該類實現一個介面,但沒有將該介面所有的方法加以實現
73、abstract方法不能被聲明為private,因為abstract類會被其他類繼承。無法產生一個abstract類的
對象,但可聲明一個abstract類類型的變數。
74、多態(polymorphism)代表同樣的標記法可用來處理多種不同類型的資料。重載是多態的一種,稱為
靜態多態。一般的多態是動態多態,是在執行時才根據對象來決定一個方法的行為,這是一種動態方法綁
定(後期綁定)。
75、C++中,多態通過虛擬函數實現,Java使用abstract類實現多態。
76、介面是用來表明一個類能做什麼,但不表明如何完成(實際的工作會交由使用此介面的程式員來完成
),因此常使用介面來制定類設計的協議(protocol),而Java API設計的主要精神就是將介面和實際類
的實現分開,因為不同的系統可能會有不同的實現方法,但使用者所使用的方式卻是一樣的,這可解決可移
植性問題。
77、介面和類一樣可當作一種資料類型,但和abstract類一樣,無法用它來產生新的對象。
78、一個介面是一群常量和abstract方法的組合,介面內的常量總是為public和static以及final(因此
,有時我們只會單純地使用介面來儲存使用者自訂地常量而不包含任何方法),而方法總為public和
abstract,即使沒有明確地聲明。
79、一個類可通過關鍵字implements來實現介面,而類可實現一個以上的介面。
80、和類定義相同,一個介面可通過extends來繼承其他介面,不同的是,介面支援多重繼承,這是由於
介面內方法未定義,並不會產生類多重繼承的問題。
81、和abstract類不同的是,當一個類實現介面,此類必須定義所有介面內的方法。
82、將介面和abstract類結合在一起。除了使用介面來進行多重繼承外,一個常用的設計方式是使用介面
來產生新的資料類型,但不會被特定的實現方式限制住,這有點類似基礎資料型別 (Elementary Data Type),並不會產生該類型的
對象,也沒有實現任何方法。而abstract類也可用來定義新的資料類型,但會選擇性地實現共同地方法。
當然,一般地類也可用來定義新地資料類型,但會實現全部地方法。因此,在設計一個較有擴充性地資料
類型時,往往會以介面為最上面一層,再以abstract類為中間的一層,而下面則為一般的類。
83、將類定義在另一個類內稱為內部類。
84、匿名類是一種沒有名稱的內部類,它也沒有建構函式。如:
button.addActionListener(new ActionListener()
{
用來實現ActionListener的程式主體
}//此對象僅用於addActionListener()中
)
85、在Java中,最常使用內部類和匿名類的地方是GUI。
86、由於匿名類並沒有名稱,因此產生的類檔案會用數字表示,如Outer$1.class
87、記憶體回收:一個較好的方法是將不用的對象設為null。
88、強制執行記憶體回收:System.gc()。
89、finalize()是在對象釋放前先執行,它是所有Java對象都會繼承的方法。
90、產生包:只要在所定義的類程式的最前面加上package{packageName};放在import之前
91、包命名:小寫字母,使用順序反過來的網域名稱。
92、包內的類需聲明為public,否則不屬於此包的方法無法使用它。
93、採用JAR檔案方便維護和安裝,一個JAR檔案往往包含多個包,Sun J2SE所提供的標準類放在rt.jar中
。
94、J2SE提供工具軟體jar來產生JAR檔案:
jar cvf <jar file> <class file>
jar cmvf <manifest> <jar file> <class file> 用m來包含自訂的說明(manifest)檔案
Manifest.mf。
95、將建立的包輸入進來:用import com.mycompany.shape.*;非import com.mycompany.shp;另外還需將
此JAR檔案包含在類路徑中,在Windows中需要設定:SET CLASSPATH=.;shapr.jar。或者可以使用:java
-classpath <class path> <class file>
96、由於和對象相關的變數屬於參考型別,使用obj1=obj2;obj1隻是得到一份obj2應用的副本,而不是
obj2對象本身。
97、使用clone()來複製一個對象,clone()從Object類繼承。obj1=obj2.clone();obj2必須是可複製的
。
98、為了使一個使用者自訂的類對象可被複製,必須使用介面Cloneable,並聲明一個public方法clone()
來執行複製工作。
99、若要完成深度複製(deep copy)(包含所參考的對象和其相關的對象),則需根據對象間的階層關係
一層層地複製下去。
100、Reflection又稱introspection,因為它允許執行中地Java程式來進行自我檢查,可以得到一個對象
所屬類定義的成員及相關的資料,這是Java特有的功能。
101、Reflection提高像功能指標一樣的功能,可在程式執行時才動態提高所以執行的類對象方法名稱與
所要輸入的參數。
102、首先得到一個Class對象,有兩種方法
由既存類對象,使用getClass()得到一個類對象,如obj.getClass();
使用Class.forName(String className)
103、其次,使用Class提供的方法來得到該類的相關資料
String getName(); 用來得到該類的名稱
Method[] getDeclaredMethods(); 得到所有在該類內所聲明的方法名稱
Method[] getMethods(); 得到所有在該類的方法名稱,包含由父類繼承的方法
Method getMethod(String methodName, Class[] parameterTypes); 得到一個Method對象
104、最後,使用Method所提供的方法來執行所要執行的方法
Object invoke(Object methodObj,Object[] parameters); 發生錯誤時,產生
InvocatioTargetException
105、利用Reflection功能來執行類內的方法時,方法的輸入資料類型是較特殊的地方,文法為:
typeName.class,如int[]為int[].class,int為int.class,String為String.class。輸入的參數必須為對
象(Object)
106、為了知道一個Java程式的執行效率,以提供改進程式的方法,Java提供了Java profiling的功能。
java -Xrunhprof:help 用於查詢Java profiling可供使用的選項。如,瞭解程式中各種方法執行時間的
比例,可使用java -Xrunhprof:cpu=times className。會產生一個java.hprof.txt檔案。
107、Throwable是所有Java程式中錯誤處理的父類,有兩種資類:Error和Exception。
108、Error:表示由JVM所偵測到的無法預期的錯誤,由於這是屬於JVM層次的嚴重錯誤,導致JVM無法繼
續執行,因此,這是不可捕捉到的,無法採取任何恢複的操作,頂多隻能顯示錯誤資訊。
109、Exception:表示可恢複的例外,這是可捕捉到的,因此,當例外發生時,可採取一些恢複的行動。
110、例外的處理方式之一:如果要忽略程式中可能發生的例外,而交由其他程式處理,可將這些例外直
接返回所調用的程式,而所調用的程式必須處理這些例外或是將它們再往上返回所調用的程式。
111、例外的處理方式之二:如果要再程式中直接處理這些例外,則可使用try...catch(...finally)的
方式。
112、finally可以省略。如果使用,finally內的程式一定會被執行,一般用來進行最後的清理工作,如
關閉所開啟的系統資源。
113、Throwable所提供的方法:
String toString():代表該Throwable對象的字串標記法。
String getMessage():返回和該對象相關的錯誤資訊。
void printStackTrace():將例外產生所發生的途徑顯示出來。
void printStackTrace(PrintStream out):輸出到一個PrintStream的資料流中,藉此可將資訊
寫到一個檔案。
void printStackTrace(PrintWriter out):輸出到一個PrintWriter的資料流中。
114、try...catch也是一種區段式的構架,對子變數的可見範圍也必須遵循同樣的規則,有時為了讓
catch(或finally)區段能使用try區段內的變數,需要將變數聲明再try...catch的區段外。
115、當程式需要捕捉數個不同的例外時,需要特別注意這些例外的順序。應該按照類之間的階層關係放
置,越是基本的類越需放在後面的catch()區段。
116、一個例外類至少需要包含一個預設的建構函式(用來顯示預設的資訊)及一個以String對象為參數
的建構函式(用來顯示使用者提供的自訂資訊)。
117、C/C++只能提供位元組流,在Java中,還有位元組(byte)流和字元(character)流之分。
118、位元組流:OutputStream提供的方法:
void write(int b):寫入一個位元組的資料
void write(byte[] buffer):將數組buffer的資料寫入流
void write(byte[] buffer,int offset,int len):從buffer[offset]開始,寫入len個位元組的數
據
void flush():強制將buffer內的資料寫入流
void close():關閉流
119、InputStream提供的方法:
int read():讀出一個位元組的資料,如果已達檔案的末端,傳回值為-1
int read(byte[] buffer):讀出buffer大小的資料,傳回值為實際所讀出的位元組數
int read(byte[] buffer,int offset,int len)
int available():返迴流內可供讀取的位元組數目
long skip(long n):跳過n個位元組的資料,傳回值為實際所跳過的資料數
void close():關閉流
120、字元流。Reader、Writer類中提供的方法與位元組流相同,只是參數內的byte[]需改為char[]
121、Stream根據功能可分為資料接聽程式流(data Sink Stream,接聽程式:記憶體、管道、檔案)和進程流
(Processing Stream)
122、在談Java的流類之前,先談如何產生一個File對象,它時一個和流無關的類。File對象可用來產生
和檔案(及其所在的路徑)或目錄結構相關的對象,由於不同的系統可能會有不同的目錄結果標記法,使
用File可完成和系統無關的目的(使用抽象的路徑標記法)。
123、File對象產生方法:
File(String path):將一個代表路徑的字串轉換為抽象的路徑標記法
File(String parent,String child):parent代表目錄,child代表檔案,child不可為空白
File(File parent,String child):parent代表一個File對象的目錄,child代表檔案,child不
可為空白
124、File提供一些方法來測試或檢查一個File對象:
boolean exists():若該檔案或目錄存在,則返回true
boolean isDirectory():若為目錄則返回true
File[] listFiles():得到該對象所代表的目錄下的File對象數組,若不為該目錄,則返回null
String[] list():同上,但返回一個String數組
long length():得到和該對象相關的檔案的大小,若不存在,則傳回值為0L
String toString():得到抽象路徑標記法
String getParent():得到抽象路徑標記法的目錄部分(不包含最後一個部分)
String getName():得到抽象路徑標記法的最後一個部分
125、改變一個File對象的方法:
boolean renameTo(File newName):將目前File對象所代表的路徑名改為newName所代表的路徑名
。若更改成功,則傳回值為true
boolean mkdir():產生一個新的目錄。入成功,則傳回值為true
boolean mkdirs():產生一個新的目錄,包含不存在的子目錄。若成功,傳回值為true
boolean delete():刪除目前File對象所代表的檔案或目錄,若是目錄,則需為空白的。若成功,
返回true
126、沒有參數的listFiles()會列出所有的檔案名稱。使用File[] listFiles(FilenameFilter filter)過
濾某些特殊的副檔名或包含某些字元的檔案名稱。FilenameFilter是一個介面,必鬚生成一個實現它的類來
負責過濾檔案名稱,該類需取代FilenameFilter惟一的方法accept()。boolean accept(File dir,String
name),若返回為true則會將目前檢查的檔案包含在listFiles()的返回數組內。
127、位元組流的建構函式:
FileInputStream(String name):開啟檔案name用以讀取資料
FileInputStream(File file):開啟和File對象file相關聯的檔案,用以讀取資料
FileOutputStream(String name):開啟檔案name用以寫入資料
FileOutputStream(File file):開啟和File對象file相關聯的檔案,用以寫入資料
FileOutputStream(String name,boolean append):開啟檔案name用以寫入資料,若append為
true,則寫入的資料會加到原有的檔案後。
128、位元組數組(byte array)的建構函式:
ByteArrayInputStream(byte[] buffer):產生一個位元組數組的輸入資料流,並指定一個位元組數組
buffer為此輸入資料流的流緩衝區。
ByteArrayOutputStream():產生一個位元組數組的輸出資料流,其緩衝區的預設初始大小為32位元組,若
有需要,緩衝區的大小會隨之增加
ByteArrayOutputStream(int size):同上,但分配size位元組的初始大小給緩衝區。
129、一些ByteArrayOutStream常用的方法:
int size():返回此流緩衝區的大小
byte[] toByteArray():產生一個新的位元組數組,並將流的內容複寫到此自己數組。
String toString():將流的內容轉換為String對象。
130、檔案的合并:SequenceInputStream
SequenceInputStream(InputStream head,InputStream tail):產生一個新的輸入資料流,先讀入
head,後是tail
SequenceInputStream(Enumeration enum):將enum內的流根據序合并韋一個新的輸入資料流,enum內
必須是InputStream對象。
131、Vector的功能就像一個數組,但它能根據需要來改變大小。
132、管道(pipe)提供一種線程間通訊的方法,可由於IPC(Inter-Process Communication,進程間通
信)或是ITC(Inter-Thread Communication,線程間通訊),但它無法執行不同主機之間的通訊。
133、一個輸入管道是用來接收一個輸出管道所寫出的資料,因此,一個線程會負責送出
(PipedOutputStream對象)資料,而另一個線程需負責接收(PipedInputStream對象)這些資料。
134、管道的資料流(data flow)是單向的,需要產生另一組輸入和輸出管道來負責另一個方向的資料傳
送。
135、如果要將管道輸出資料流的資料送到管道輸入資料流,可使用
PipedOutputStream(PipedInputStream pipeIn)或
connect(PipedInputStream pipeIn)
140、字元流的類:1),BufferedReader是一種過濾器(filter)(extends FilterReader)。過濾器用
來將流的資料加以處理再輸出。建構函式為:
BufferedReader(Reader in):產生一個緩衝的字元輸入資料流,in為一個讀取器
BufferedReader(Reader in,int size):產生一個緩衝的字元輸入資料流,並指定緩衝區的大小為
size
常用的方法為:
String readLine():讀入一行的文字(以/n或/r結尾),返回的String對象並不包含/n或/r,若
已達流的末端則返回null
當使用緩衝流的read()或readLine()讀取資料時,先會嘗試從緩衝區讀取,若緩衝區中並沒有數
據,則會儘可能的將資料讀入緩衝區中,以留待後續的讀取。
141、2),LineNumberReader也是一種過濾器,而它也是一種緩衝流(extends BufferedReader),可用
來記錄讀入的行數,這裡所謂的一行時以/n或/r結尾。常用方法:
int getLineNumber():得到目前的行數。
142、3),PrinterWriter也是一種過濾器(extendes FilterWriter),可用來將輸出匯入某種裝置。
143、I/O流的一個特點是它們能經過流連結的方式結合在一起,每個流類會執行特殊的工作再將結果傳到
下一個連結,可使用過濾器將流連結在一起。
BufferedReader inBuffer=new BufferedReader(new FileReader(inFile));
使用流連結時,只需要關閉最外層的連結流,其他連結的流會自動關閉。可以使用的連結是最後一個流(
inBuffer),此時,我們並無法直接使用FileReader流。如果寫成:
FileReader fileIn=new FileReader(inFile);
BufferedReader inBuffer=new BufferedReader(fileIn);
此時,fileIn仍存在,這可能會因寫程式的疏忽而造成同時有兩個流連結導同一個來源(inFile),這往
往會有潛在的危險。
144、隨機存取:RandomAccessFile,建構函式
RandomAccessFile(File file,String mode):其中mode是用來指定存取的模式,可為r,w或rw
RandomAccessFile(String name,String mode):name為和系統相關的檔案名稱字
常用方法:
讀取:boolean readBoolean();byte readByte();char readChar();double readDouble
();float readFloat();int readInt();long readLong();short readShort();String readLine()
寫入:void writeByte(Byte v);void writeByte(String s);void writeChar(char v);void
writeChars(String s);void writeDouble(double v);void writeFloat(float v);void writeInt(int
v);void writeLong(long v);void writeShort(short v)
與目前檔案位置有關的方法:
void seek(long pos):將檔案指標移到pos(不可為負)的位置這是相對於檔案初始位置的值(
初始值為0)
long getFilePointer():得到目前檔案指標的位置。
long length():得到檔案的長度
145、檔案壓縮及解壓縮方法:ZipInputStream(extends InflaterInputStream)和ZipOutputStream
(extends DeflaterOutputStream)
146、將檔案寫入ZIP檔案的步驟:
1)產生和所要產生的ZIP檔案相關聯的ZipOutputStream對象
2)一個ZIP檔案往往不只含有一個壓縮檔,我們將每個要加入的檔案稱為一個ZIP入口,我們
使用ZipEntry(String fileName)來產生這些ZipEntry對象。
3)使用putNextEntry(ZipEntry entry)將此ZIP入口加入ZIP檔案
4)將檔案內容寫入此ZIP檔案
5)使用closeEntry()結束目前的ZIP入口,繼續下一個ZIP入口
147、將壓縮檔從ZIP檔案讀出的步驟:
1)產生和所要讀入的ZIP檔案相關聯的ZipInputStream對象
2)利用getNextEntry()得到下一個ZIP入口
148、我們將對象存取自一個流稱為序列化(serialization),為了完成對象的序列化(將一個對象寫導
流稱為序列化(serializing),而從一個流將對象讀出稱為還原序列化(deserializing))。
149、存取的對象需滿足下列條件:
類需為public
類需實現Serializable介面
若有資料不是可序列化的或不需要寫出,則需將其聲明為transient
150、java.io提供ObjectInputStream和ObjectOutputStream來存取對象,由於它們和DataInputStream及
DataOutputStream有共同的介面,因此它們也可使用相同的方法來讀取或寫入資料。還有其他的方法:
void writeObject(Object obj):用於ObjectOutputStream,將對象寫入流
Object readObject():用於ObjectInputStream,將對象由流讀出。