第一章 概述
名詞解釋
體系結(jié)構(gòu)中立:java編譯器會(huì)生成與特定的計(jì)算機(jī)體系結(jié)構(gòu)無(wú)關(guān)的字節(jié)碼,只要有java運(yùn)行時(shí)系統(tǒng),就可以在許多處理器上運(yùn)行,而且還可以跨素的翻譯成本地機(jī)器的代碼。
高性能:它通過(guò)即時(shí)編譯器,一次把字節(jié)碼編譯為本地代碼,并將結(jié)果緩存起來(lái),在需要的時(shí)候重新調(diào)用,從而提高運(yùn)行速度。
可移植性:各種類型的數(shù)據(jù)都明確的規(guī)定了其大小,不隨處理器的改變而改變;二進(jìn)制有嚴(yán)格的格式,這樣就能輕松移植到其他處理器上執(zhí)行。
第三章 JAVA語(yǔ)法基礎(chǔ)
1.書中提到JAVA中的每個(gè)類都要有一個(gè)main方法,但我們平時(shí)設(shè)計(jì)的類里都沒有main方法,怎么解釋?
2.在jdk 5.0中用p表示指數(shù)。
3.浮點(diǎn)數(shù)不適合用于禁止出現(xiàn)舍入誤差的金融計(jì)算中,因?yàn)楦↑c(diǎn)數(shù)采用的是二進(jìn)制系統(tǒng)表示的,而在二進(jìn)制中無(wú)法精確表示出0.1,就好象十進(jìn)制無(wú)法精確表示出1/3一樣,這時(shí)應(yīng)該用BigDecimal。
4.熟悉math類和String類的常用方法。
5.JAVA中將String類的對(duì)象稱為不可變字符串,原因是不能修改JAVA字符串,平時(shí)所謂的修改,只是將字符串變量指向了另外個(gè)字符串常量。equals方法判斷兩字符串內(nèi)容是否相等,而‘==’檢測(cè)兩字符串的內(nèi)存位置是否相等。
6.大數(shù)值BigInteger、BigDecimal,可以處理任意長(zhǎng)度的數(shù)值,但是他們沒有+ 、*等運(yùn)算,而是使用他們的add()、multiply()方法。
7.Arrays類(不是Array類)方法:sort(type[] a)排序,binarySearch(type[] a,v)二分查找法查找v所在的位置,若數(shù)組a事先沒有排序結(jié)果將返回負(fù)數(shù)。
第四章 類和對(duì)象
關(guān)鍵句子:
1. 一個(gè)對(duì)象并沒有實(shí)際包含對(duì)象,而僅僅引用一個(gè)對(duì)象。
2. 為了保持?jǐn)?shù)據(jù)的隱藏性,強(qiáng)烈建議將實(shí)例域標(biāo)記為private。
3. 一發(fā)方法可以訪問(wèn)所屬類的所有對(duì)象的私有數(shù)據(jù)。
4. 本地方法可以修改由final修飾的常量值。
5. 因?yàn)殪o態(tài)方法不能操作對(duì)象,所以不能在靜態(tài)方法中訪問(wèn)實(shí)例域。但是,靜態(tài)方法可以訪問(wèn)自身類的靜態(tài)域。
6. 方法參數(shù)使用:
JAVA中的參數(shù)傳遞都是值傳遞。
1).一個(gè)方法不能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)。
2).一個(gè)方法可以改變一個(gè)對(duì)象參數(shù)的狀態(tài)。
3).一個(gè)方法不能讓對(duì)象參數(shù)引用另一個(gè)對(duì)象(如果可以那就是指針即引用傳遞了)。
7. 變量在使用前必須進(jìn)行初始化,否則會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤,而域如果不初始化將為默認(rèn)值(0、false或null)。
8. 僅當(dāng)類沒有提供任何構(gòu)造器時(shí),系統(tǒng)才會(huì)提供一個(gè)默認(rèn)的構(gòu)造器。若類提供了至少一個(gè)構(gòu)造器,但是沒有
提供默認(rèn)的構(gòu)造器,那么在構(gòu)造對(duì)象時(shí)若不提供參數(shù)將視為不合法。
9. 調(diào)用構(gòu)造器的步驟:
1).所有數(shù)據(jù)域被初始化為默認(rèn)值(0、flase或null)。
2).按順序執(zhí)行所有域初始化語(yǔ)句和初始化塊。
3).如果構(gòu)造函數(shù)第一行調(diào)用了另一個(gè)構(gòu)造器,則先執(zhí)行第二構(gòu)造器,再執(zhí)行第一構(gòu)造器主體部分。
10. 創(chuàng)建一類對(duì)象的方法稱為工廠方法,如NumberFortmat類中的getNumberInstance()方法,此方法返回類型為
NumberFormat的對(duì)象。
11. 對(duì)靜態(tài)域進(jìn)行初始化可以使用靜態(tài)初始化塊,用static{}標(biāo)志??梢岳渺o態(tài)初始化塊寫一個(gè)沒有main函數(shù)
的程序。
12. 用類似import java.util.*;的形式導(dǎo)入所使用的類,對(duì)代碼的大小沒有任何負(fù)面影響,但是讀者不易知道程序
加載了哪些類,可讀性差一些。
13. 靜態(tài)導(dǎo)入:JDK 5.0增加了導(dǎo)入靜態(tài)方法和靜態(tài)域的功能,但可讀性明顯降低,在使用Math類的方法和使用
Calendar類的常量時(shí)可以使用這種靜態(tài)導(dǎo)入,使代碼簡(jiǎn)潔。
14. 虛擬機(jī)如何定位類?
有關(guān)時(shí)間的兩個(gè)類:Date類和GregorianCalendar類,前者用來(lái)表示時(shí)間點(diǎn),后者是人們所熟悉的日歷表示形式,用不同的類表示不同的概念是個(gè)很好的思想。
時(shí)間操作:
獲取當(dāng)前時(shí)間
獲取某個(gè)時(shí)間的某個(gè)格式
設(shè)置時(shí)間
時(shí)間有關(guān)計(jì)算
涉及到的類有java.util.Date;java.sql.Date;java.text.SimpleDateFormate;java.util.Calendar;
1.獲取當(dāng)前時(shí)間直接用Date()既可。
2.獲取時(shí)間格式 用到時(shí)間格式化類SimpleDateFormate,首先創(chuàng)建一個(gè)格式化的實(shí)例,并指定其時(shí)間模式與區(qū)
域;然后去格式化原始時(shí)間。代碼示例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日_HH時(shí)mm分ss
秒",Locale.SIMPLIFIED_CHINESE);//定義一個(gè)格式化器,包括一個(gè)模式和時(shí)區(qū)
String timeStr = sdf.format(new Date()); //真正格式化當(dāng)前時(shí)間
3.設(shè)置時(shí)間 與獲取時(shí)間類似,這里只寫出代碼示例
SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);
sdf.applyPattern("yyyy年MM月dd日_HH時(shí)mm分ss秒");
Date date = sdf.parse("2006年07月01日_14時(shí)00分00秒");
4.時(shí)間計(jì)算
主要用到Calendar類,此類可以輕松獲取當(dāng)前時(shí)間的年、月、日、小時(shí)、分、秒,獲取到這些值后關(guān)于計(jì)算
只是簡(jiǎn)單整型數(shù)學(xué)算術(shù)了。代碼示例:
Calendar ca1 = Calendar.getInstance();
Calendar ca2 = Calendar.getInstance();
ca1.setTime(date1);
ca2.setTime(date2);
int distanceHour = ca2.get(Calendar.HOUR_OF_DAY) - ca1.get(Calendar.HOUR_OF_DAY);
第五章 繼承
1. super不能指向一個(gè)對(duì)象,不即不代表當(dāng)前類對(duì)象引用,也不代表超類對(duì)象引用,他只是一個(gè)調(diào)用超類方法
的一個(gè)關(guān)鍵字。如果子類沒有顯式的調(diào)用超類的構(gòu)造器,則將自動(dòng)地調(diào)用超類默認(rèn)的構(gòu)造器。
2. 一個(gè)對(duì)象變量可以引用多種實(shí)際類型的現(xiàn)象被稱為多態(tài)。尤其是一個(gè)對(duì)象變量可以引用其子類的對(duì)象。在
運(yùn) 行時(shí)能夠自動(dòng)地選擇調(diào)用的適當(dāng)方法的現(xiàn)象稱為動(dòng)態(tài)綁定。如果方法是private、static、final或者構(gòu)造器,
那么編譯器可以準(zhǔn)確地知道應(yīng)該調(diào)用哪個(gè)方法。我們將這種調(diào)用方式稱為靜態(tài)綁定。在覆蓋一個(gè)方法時(shí),
子類方法不能低于超類方法的可見性。
4. 如果將一個(gè)類聲名為final,其方法將自動(dòng)地成為final,而它的域則不一定是final的。
5. 強(qiáng)制類型轉(zhuǎn)換規(guī)則:只能在繼承層次內(nèi)進(jìn)行類型轉(zhuǎn)換;在將超類轉(zhuǎn)換成子類之前,應(yīng)該使用instanceof方法進(jìn)
行檢查。
6. 抽象類:它有什么必要?它可以包括非抽象方法和具體數(shù)據(jù),不包含抽象方法的類也可以聲名為抽象類,
但它仍然不可以實(shí)例化??梢远x一個(gè)抽象類型的對(duì)象變量,但它只能引用非抽象子類的對(duì)象。
7. 數(shù)據(jù)封裝原則之一,在本類做了任何修改不影響其他地方。
8. 4個(gè)訪問(wèn)修飾符的可見性:private只對(duì)本類可見;public對(duì)所有類可見;protected對(duì)本包及所有子類可見;默
認(rèn)對(duì)本包可見。
9. Object類的equals方法設(shè)計(jì)講究很多原則,他用于比較兩個(gè)對(duì)象是否相等,是比較兩個(gè)對(duì)象的內(nèi)存地址是否
相等。若子類不覆蓋此方法,相等性比較將也是比較兩個(gè)變量是否引用同一快內(nèi)存空間,這顯然是沒有任
何意義的,所以設(shè)計(jì)類時(shí)一般要覆蓋掉Object類的equals方法。
10. hashCode方法:是由對(duì)象導(dǎo)出的一個(gè)沒有規(guī)律的整型值,所以若x和y是兩個(gè)不同對(duì)象,其散列碼基本上不
會(huì)相等。Object的散列碼值是對(duì)象的存儲(chǔ)地址。若子類重寫了Object的equals方法,也必須重寫Object的
hashCode,因?yàn)閮蓚€(gè)對(duì)象相等,他們必須保證有相同的散列碼。
11. toString()方法,用于返回表示對(duì)象狀態(tài)值的字符串,Object中的toString()方法得到類名和散列碼,很多方法
都覆蓋了Object的toString方法,用于輸出對(duì)自己有意義的結(jié)果
12. ArrayList是一個(gè)采用類型參數(shù)的泛型類。此功能在JDK5.0以后才出現(xiàn)。
13. 將基本數(shù)據(jù)類型如 int轉(zhuǎn)換為包裝類型如 Integer的構(gòu)成叫打包,反過(guò)來(lái)叫拆包。在JDK5.0以前必須手工地
插入打包和拆包的代碼,現(xiàn)在編譯器可以自動(dòng)的進(jìn)行打包拆包動(dòng)作。
14. JDK5.0以后支持參數(shù)個(gè)數(shù)可變的方法。
15. 反射:這個(gè)久聞的詞對(duì)我來(lái)說(shuō)一直很神秘,今天拜讀了這章內(nèi)容,了解了一些概念,但仍然沒有領(lǐng)會(huì)到
其中的原理,只聽說(shuō)spring的IOC就是基于這個(gè)原理而設(shè)計(jì)的。這里我只記錄一些需要記憶性的概念、方
法,至于深層的原理,還得再來(lái)一遍了。
能夠分析類能力的程序稱為反射??梢岳梅瓷錂C(jī)制:
a. 在運(yùn)行時(shí)分析類的能力。
b. 在運(yùn)行時(shí)查看對(duì)象,例如,編寫一個(gè)toString方法供所有類使用。
c. 實(shí)現(xiàn)數(shù)組的操作代碼。
d. 利用Method對(duì)象,使用一個(gè)叫“對(duì)象指針”的東西。
反射是一個(gè)功能強(qiáng)大但復(fù)雜的機(jī)制,它的主要使用對(duì)象是工具構(gòu)造者,并不針對(duì)項(xiàng)目開發(fā)中的代碼編寫
者。
16. Class類:在程序運(yùn)行期間,JAVA運(yùn)行時(shí)系統(tǒng)始終為所有的對(duì)象維護(hù)一個(gè)被稱為運(yùn)行時(shí)的類型標(biāo)志。這個(gè)
信息保存著每個(gè)對(duì)象所屬的類足跡。虛擬機(jī)利用運(yùn)行時(shí)信息選擇相應(yīng)的方法執(zhí)行。可以通過(guò)專門的JAVA
類訪問(wèn)這些信息。保存這些信息的類被稱為Class。虛擬機(jī)為每個(gè)類型管理著一個(gè)Class對(duì)象。
java.lang.Class類:
static Class forName(String className)返回類名為className的Class對(duì)象。
Object newInstance()返回一個(gè)該類的實(shí)例。
典型的應(yīng)用在加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)時(shí),先創(chuàng)建一個(gè)驅(qū)動(dòng)類的對(duì)象,再返回該類的實(shí)例。
Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
17. 使用反射分析類的能力(檢查類的結(jié)構(gòu)):
在java.lang.reflect包中有三個(gè)類Field、Method、Constructor分別用語(yǔ)描述類的域、方法和構(gòu)造器。公用的方
法有g(shù)etName()--返回該條目的名字;getModifiers()返回一個(gè)整形數(shù)值,此數(shù)值用于判斷該條目的修飾符。
Class類的getFields、getMethods、getConstructors方法將分別返回類支持的Public域、方法和構(gòu)造器數(shù)組,其
中包括類的公有成員。Class類的getDeclareFields、getDeclareMethods、getDeclareConstructors方法將分別返回
類中聲明的全部域、方法和構(gòu)造器,其中包括私有域,但不包括超類中的條目。
... ...
第六章 接口與內(nèi)部類
1. 接口不是類,而是一組對(duì)類的需求描述,這些類要遵從接口描述的同意格式進(jìn)行定義。接口中的所有方法
自動(dòng)地屬于public,域自動(dòng)的屬于public static final,因此在聲明方法時(shí),不必提供關(guān)鍵字public,但為了增強(qiáng)
代碼閱讀性,依然要加上關(guān)鍵字public。接口不能含有實(shí)例域和靜態(tài)方法,但可以包含常量。
2. JAVA機(jī)制提供接口的必要性:JAVA是一種強(qiáng)制類型語(yǔ)言,在調(diào)用方法的時(shí)候編譯器將會(huì)檢查這個(gè)方法是
否存在。檢查接口中是否存在此方法比在本類中檢查是否存在此方法要快得多?
3. 書中提到的一個(gè)有用例子:Arrays類中有個(gè)sort(Object[] a)方法,可以對(duì)a中的元素排序,但要求數(shù)組中的元
素必須實(shí)現(xiàn)compareable接口,并且在元素對(duì)象中要提供具體的compareTo()方法。compareTo()方法的設(shè)計(jì)很
有講究,其一是要符合“反對(duì)稱”原則。
4. 對(duì)象克?。荷梢粋€(gè)對(duì)象的一個(gè)拷貝,對(duì)它進(jìn)行修改不會(huì)影響原來(lái)對(duì)象的狀態(tài)。默認(rèn)的克隆操作是“淺拷
貝”,它并沒有克隆包含在對(duì)象中的對(duì)象,比方說(shuō)user.menus。為了實(shí)現(xiàn)對(duì)象的深烤貝,我們應(yīng)該重寫
Object類的clone()方法,對(duì)對(duì)象內(nèi)部的對(duì)象域再進(jìn)行克隆。
5. 使用clone()方法并不必須要實(shí)現(xiàn)Cloneable,因?yàn)閏lone()方法可以從Object類中繼承過(guò)來(lái);是這樣的嗎?
6. 回調(diào):是一種設(shè)計(jì)模式,在這種設(shè)計(jì)模式中,可以指出某個(gè)特定事件發(fā)生時(shí)應(yīng)該采取的動(dòng)作。但如下:
for(int i = 0;i < 10;i++){
if(i == 5){
System.out.println("i's value is:" + i);
}
}
即當(dāng)i==5時(shí)采取out.println()事件,這算是回調(diào)嗎?回調(diào)與方法調(diào)用區(qū)別在哪里?
7. 內(nèi)部類:定義在類中的類。它有如下特點(diǎn):
a. 內(nèi)部類方法可以訪問(wèn)該類定義的所在的作用域中的數(shù)據(jù),包括私有的數(shù)據(jù)。
b. 內(nèi)部類可以對(duì)同一個(gè)包中的其他類隱藏起來(lái)。
c. 當(dāng)想定義一個(gè)回調(diào)函數(shù),又不想編寫大量代碼時(shí),使用匿名內(nèi)部類非常便捷。
對(duì)于 ${c}完全不能理解,內(nèi)部類到底有多大必要,沒有體會(huì)。
8. 代理:...
第11章 異常與調(diào)試
倆概念--1、已檢查異常,需要我們進(jìn)行聲明或捕獲的異常類型,當(dāng)異常發(fā)生時(shí),我們要尋找合適的處理器進(jìn)行異常處理;2、未檢查異常,要么不可控制(error),要么就應(yīng)該避免他們的發(fā)生(數(shù)組下標(biāo)越界)。