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