? ? ? ? 在生活和工作中有很多碎片時間可以用來看書,但通常書籍一般都五六百頁,常常忘記自己看到哪里,遂開文章記錄.選擇這本書因我專業基礎并不扎實,而且安卓也是基于java,此書可以彌補自己的不足。若看完本書將購買《Java核心技術卷2 高級特性(原書第9版)》。
? ? ? ? 第一章:Java程序設計概述
? ? ? ? 本章主要講述了Java中關鍵的術語:簡單性、面向對象、網絡技能、健壯性、安全性、體系結構中立、可移植性、解釋型、高性能、多線程、動態性。
? ? ? ? 面向對象有三個特征:封裝、繼承、多態。
? ? ? ? 因面試遇到過這個問題,在這里詳細說明一下面向對象的定義和三個特征。
? ? ? ? 面向對象:
(1)對象
? ? 首先說明對象,對象是人們要進行研究的任何事物,從最簡單的整數到復雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示抽象的規則、計劃或事件。用一句裝b的話來說,萬物皆對象。
? (2)對象的狀態和行為。
對象具有狀態,一個對象用數據值來描述它的狀態。
對象還有操作,用于改變對象的狀態,對象及其操作就是對象的行為。
對象實現了數據和操作的結合,使數據和操作封裝于對象的統一體中
(3)類。
具有相同特性(數據元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象,類實際上就是一種數據類型。
類具有屬性,它是對象的狀態的抽象,用數據結構來描述類的屬性。
類具有操作,它是獨享的行為的抽象,用操作名和實現該操作的方法來描述。
(4)類的結構。
在客觀世界中有若干類,這些類之間有一定的結構關系。通常有兩種主要的結構關系,即一般--具體結構關系,整體--部分結構關系。
①一般--具體結構稱為分類結構,也可以說是“或”關系,或者是“is a”關系。
②整體--部分結構稱為組裝結構,它們之間的關系是一種“與”關系,或者是“has a”關系。
(5)消息和方法。
對象之間進行通信的結構叫做消息。在對象的操作中,當一個消息發送給某個對象時,消息包含接收對象去執行某種操作的信息。發送一條消息至少要包括說明接受消息的對象名、發送給該對象的消息名(即對象名、方法名)。一般還要對參數加以說明,參數可以是認識該消息的對象所知道的變量名,或者是所有對象都知道的全局變量名。
類中操作的實現過程叫做方法,一個方法有方法名、返回值、參數、方法體。
(6)面向對象
? ? 面向對象是一種思想,它基于面向過程,強調的是具備功能的對象,讓對象調用方法解決問題。在開發中,要完成特定的功能就要去尋找具備相應功能的對象,如果找不到對象就創建對象,適用對象,維護完善對象。比如人們想吃飯,可以去飯館買著吃也可以自己做,自己做就是面向過程,需要買菜、洗菜、做飯、再吃飯。去飯館就是面向對象,給錢然后吃飯。省去了做的過程。再比如洗衣服,如果沒有女朋友就得自己洗,就是面向過程。女朋友給洗呢,就是面向對象,但也有有了女朋友也面向過程的情況……
? ? 面向對象的思想特點是 1.讓復雜的事情簡單化。2.更符合人類的思維要求。3.角色從執行者變為指揮者。
(7)面向對象特征:封裝
? ? 封裝就是把不需要對外暴露的狀態信息隱藏在對象內部,不允許外部程序直接訪問對象的信息,而是通過該類對外提供公共的訪問方式對其訪問和操作。好處是將變化隔離,提高了安全性,便于使用,提高了重用性。
(8)面向對象特征:繼承
? ? 當多各類中有很多共性的內容時,我們可以把這些共性內容抽取出來封裝成一個類,讓這些類與這個封裝的類產生關系,這種關系就是繼承。Java只支持單繼承,但能夠多層次繼承。接口能夠單繼承,也能夠多繼承。
? ? 好處是提高了代碼的復用性,提高了代碼的維護性,提高了代碼的擴展性,讓類與類產生了關系,是多態的前提。弊端是增強了類與類的耦合性。
(9)面向對象特征:多態
? ? 多態就是同一事物在不同時刻表現出來的不同狀態。
? ? 體現是父類引用指向子類對象,父類引用作為參數可以接收其子類對象,接口引用作為參數可以接收其實現類對象。
? ? 前提是類與類之間要有關系,要么繼承,要么實現,要有方法重寫,父類或者接口指向子類對象。
? ? 好處是提高了代碼的維護性,提高了代碼的擴展性
? ? 弊端是父類引用只能調用父類的方法,不能調用子類特有的方法和屬性。
?? ?向上轉型:父類或者父接口指向子類對象。
? ? 向下轉型:把那個引用強制轉為子類對象。
? ? 多態中成員方法和變量的特點:一般方法編譯看左邊(父類)運行看右邊(子類),靜態方法編譯看左邊運行看左邊,變量是編譯看左邊運行看左邊。
? ? ? ? java 1.0版本 1996年 內容為語言本身 類與接口的數量211個
? ? ? ? java 1.1版本 1997年 內容為內部類?類與接口的數量477個
? ? ? ? ?java 1.2版本 1998年 內容為無?類與接口的數量1524個
? ? ? ? java 1.3版本 2000年 內容為無 類與接口的數量1840個
? ? ? ? java 1.4版本 2002年 內容為斷言?類與接口的數量2723個
? ? ? ? java 5.0版本 2004年 內容為泛型類型、“for each”循環、可變元參數、自動裝箱、元數據、枚舉、靜態導入 ?類與接口的數量3279個
? ? ? ? java 6版本 2006年 內容為無?類與接口的數量3793個
? ? ? ? java 7版本 2011年 內容為基于字符串的switch、變形操作符、二進制字面量、異常處理改進?類與接口的數量4024個
? ? ? ? 第二章:Java程序設計環境
下載JDK、配置環境變量
? ? 開發工具(IDE):eclipse
? ? applet已經很少有人使用,忽略。
? ? ? ?第三章:Java的基本程序設計結構
? ? java對大小寫敏感
? ? 類名是以大寫字母開頭的名詞,每一個單詞的第一個字母都大寫
? ? 整型 int4字節 short2字節 long8字節 byte1字節
? ? 浮點類型 float4字節 double8字節
? ? char類型 通常表示字符常量 ? \b退格 \t制表 \n換行 \r回車 \"雙引號 \'單引號 \\反斜杠
? ? boolean布爾類型
? ? 變量、變量初始化
? ? 常量名使用全大寫?
? ? 運算符+-*/ ?++ ?-- 前綴方式先先進性+-再運算,后綴方式使用原來的值。== !=?
? ? 位運算符&(與)|(或)^(亦或)~(非)
? ? 數學常量與函數 Math.sin cos tan atan?
? ? 數值類型之間的轉換,強制類型轉換
? ? 字符串 檢測字符串是否相等equals “”和null ?字符串的api
? ? 輸入輸出 格式化輸出 Scanner
? ? 控制流程 條件語句 if()else{} ?循環語句 while(true){} ?for(int x =1;x<=10;i++){} 多重選擇 switch (case){}case可以為char byte short int 枚舉
? ? 大數值BigInteger BigDecimal
? ? 數組 int[] a=new int[100] ?java中允許數組的長度為0 ? for each 循環(增強for) 數組排序 Arrays.sort?
? ? ? ? 第四章:對象與類
1.面向對象程序設計概述(OOP)
Pascal設計設出書《算法+數據結構=程序》,面向對象程序設計將數據放在第一位,然后再考慮操作數據的算法。
1.1類
封裝,關鍵在于絕對不能讓類中的方法直接地訪問其他類的實例域,所有類的父類Object
1.2類與類之間的關系
依賴(uses-a)一個類的方法操縱另一個類的對象,我們可以說一個類依賴另一個類。
聚合(has-a)一個對象包含另外一個對象
繼承(is-a)類a擴展類b,類a不但包含從類b繼承的方法,還會擁有一些額外的功能。
在java中任何對象變量的值都是對存儲在另外一個地方的一個對象的引用,new操作符的返回值也是一個引用。
對實例域作出修改的方法成為更改器方法(mutator method)比如set和add方法,僅訪問實例域而不進行修改的方法成為訪問器方法(accessor method)比如get方法。
多個源文件的使用(109頁)?
靜態方法由類名直接調用,而不是用對象調用。
方法參數:一個方法不可能修改一個基本數據類型的參數,而對象引用作為參數就不能同了。
比如,double percent=10; tripleValue(percent);
public static void tripleValue(double x){x=3*x}
經過以上步驟,最終x還是等于10.
如果:harry=new Employee(...); tropleSalary(harry);
public static void tripleSalary(Employee x){x.raiseSalary(200)};
最終x和harry引用的Employee中的屬性增加了3倍?大概是這個意思吧。
最終說明Java程序設計語言對對象采用的不是引用調用,實際上對象引用進行的是值傳遞。
Java程序設計語言中方法參數的使用情況:
一個方法不能修改一個基本數據類型的參數(即數值型和布爾型)
一個方法可以改變一個對象參數的狀態。
一個方法不能讓對象參數已用一個新的對象。
2.對象構造
重載:多個方法有相同的名字、不同的參數。返回值不屬于方法簽名的一部分,不能有兩個名字相同,參數類型也相同卻返回不同類型值的方法。
如果類中沒有構造器,系統會提供一個無參構造,如果只有一個有參構造,不能使用無參構造創建對象。
類的參數名可以采用this.name 的形式訪問實例域,this指示隱式參數,也就是被構造的對象。如果構造器的第一個語句形如this(...),這個構造器將調用同一個類的另一個構造。比如Android中自定義View 構造參數中,一個參數的調用兩個參數的,兩個參數調用三個參數的構造。
java有垃圾回收機制,可以為任何一個類添加finalize方法,這個方法將在垃圾回收器清楚對象之前調用。
3.包
類導入的兩種形式,靜態導入,包作用域,類路徑,設置類路徑,文檔注釋
4.類的設計技巧
一定要保證數據私有、一定要對數據初始化、不要在類中使用過多的基本類型、不是所有的域都需要獨立的域訪問器和域更改器、將職責過多的類進行分解、類名和方法名要體現他們的職責。
第五章:繼承
1.類、超類和子類
超類不能使用子類的方法,子類能使用父類的方法和屬性(域)。在子類方法中第一行添加super 便可先調用父類的方法,也可調用超類的構造器,如果沒有調用,將自動調用。
2.多態
Employee e;
e=new Employee(...); 員工是一個員工
e=new Manager(...);經理是一個員工
動態綁定:
①編譯器會獲得所有可能被調用的候選方法
②編譯器將查看調用方法時提供的參數類型,并進行匹配,這個過程稱為重載解析
③如果是private方法static方法final方法或者構造器,編譯器會準確知道調用哪個方法,這個稱為靜態綁定
④虛擬機預先為每個類創建了一個方法表,列出了簽名和實際調用的方法,如果子類沒有會在超類中查找。
3.final修飾類不可被繼承,方法自動稱為final方法,修飾方法不能被覆蓋。String類也是final類。
強制類型轉換:
double x =3.405; int nx=(int)x; 將x轉換為整數,舍棄了小數部分。只能在繼承層次內進行類型轉換。
抽象類:
實現類重寫抽象方法,類不含抽象方法,也可以將類聲明為抽象類,抽象類不能被實例化(不能new),但可以創建具體子類。
受保護訪問:
如果超類的屬性設置為proteced,子類可以訪問,其他類不可以。
4.Object所有類的超類
可以使用Object類型的變量引用任何類的對象。在java中只有基本數據類型不是對象。
相等測試與繼承:Java語言規范要求equals方法具有下面的特性,自反性、對稱性、傳遞性、一致性。
使用instanceof檢測?調用getClass檢測。
hashCode方法(散列碼)
toString方法返回標示對象值的字符串
5.泛型數組列表?
給集合添加泛型,不必指出數組的大小,使用add將任意多的元素添加到數組中,使用size()替代length計算元素的數目,使用a.get(i)替代a[i]訪問元素。
6.對象包裝器與自動裝箱
Integer 是int 的包裝器,包裝器還有Long、Float、Double、Short、Byte、Character、Void和Boolean.
list.add(Integer.valueof(3))這種變換成為自動裝箱。int n=list.get(i)稱為自動拆箱。
7.參數數量可變的方法。
方法參數為Object…args 是可變參數
枚舉類:public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE}這個聲明定義的類型是一個類,剛好有4個實例。每個枚舉類型都有一個靜態的values方法,它將返回一個包含全部枚舉值的數組。
8.反射,能夠分析類能力的程序稱為反射。
反射可以用來:在運行中分析類的能力,在運行中查看對象,例如,編寫一個toString方法供所有類使用。實現通用的數組操作代碼。利用Method對象,這個對象很像C++中的函數指針。
Class類.Object類的getClass方法將會返回一個Class類型的實例。
異常捕獲,try{}catch(Exception e ){}
利用反射分析類的能力-檢查類的結構?
在運行時使用反射分析對象?
使用反射編寫泛型數組代碼,調用任意方法。
9.繼承設計的技巧
將公共操作和域放在超類,不要使用受保護的域,使用繼承實現“is-a”關系,除非所有繼承的方法都有意義否則不要使用繼承,在覆蓋方法時不要改變預期的行為,使用多態而非類型信息,不要過多地使用反射。
第六章:接口與內部類
1.接口
在Java程序設計語言中,接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統一格式進行定義。
接口絕不能含有實例域,也不能在接口中實現方法,接口中所有方法都是public的。
接口不是類,不能new,但能聲明接口的變量。接口中不能包含實例域和靜態方法,可以包含常量,接口中的域被自動設為public static final.
類實現多個接口,使用逗號將實現的各個接口分隔開。
2.回調 是一種常見的設計模式,可以指出某個特定事件發生時應該采取的動作。
3.內部類 定義在另一個類中的類。
特點:
①內部類方法可以訪問該類定義所在的作用域中的數據,包括私有數據
②內部類可以對同一個包中的其他類隱藏起來
③當想要定義一個回調函數且不想編寫大量代碼時,使用匿名內部類比較便捷。
局部內部類、匿名內部類、靜態內部類
代理:利用代理可以在運行時創建一個實現了一組特定接口的新類,這種功能只有在編譯時無法確定需要實現哪個接口時才有必要使用。
第七章:圖形程序設計
略。
第八章:事件處理
略。
第九章:Swing用戶界面組件
略。
第十章:部署應用程序和applet
1.部署應用程序:JAR文件、清單文件、可運行jar文件、沙箱?簽名代碼
2.應用程序首選項存儲?
屬性映射:是一種存儲鍵/值對的數據結構。屬性映射經常被用來存放配置信息。?
特性:鍵和值都是字符串、鍵/值對可以很容易地寫入文件或者從文件讀出、用二級表存放默認值。
Properties() 創建一個空的屬性映射?
Properties(Properties defaults) ?用一組默認值創建空的屬性映射
Preferences API :提供了一個與平臺無關的中心知識庫,在Windows中,Preferences類用來注冊存儲信息。這個類具有樹狀結構,每個節點的路徑類似于包名,api的設計者建議配置節點路徑與程序中的包名匹配。每個節點都有一個用來存放鍵、值的獨立表,用戶可以用這張表存放數字,字符串或字節數組,但不適合存放序列化的對象。
第十一章:異常、斷言、日志和調試
1.處理錯誤
異常分類:Throwable類
Error 類層次結構描述了Java運行時系統內部錯誤和資源消耗錯誤。
Exception層次結構分為RuntimeException 和 IOException.
RuntimeException包括:錯誤的類型轉換,數組訪問越界,訪問空指針
IOException包括:試圖在文件尾部后面讀取數據、試圖打開一個不存在的文件、試圖根據給定的字符串查找Class對象,而這個字符串表示的類并不存在。
聲明已檢查異常:在方法參數后面 throws FileNotFoundExcption.
聲明情況包括以下4種:調用一個拋出已檢查異常的方法、程序運行過程中發現錯誤,并且利用throw語句拋出一個已檢查異常、程序出現錯誤、java虛擬機和運行時庫出現的內部錯誤。
捕獲異常:try{}catch(ExceptionType e){} ?如果在try中的代碼拋出了catch中的異常,執行catch后的代碼。
可以捕獲多個異常,再次拋出異常與異常鏈、finally子句,一定會執行的語句、帶有資源的try語句?分析堆棧跟蹤元素
使用異常機制的技巧:異常處理不能代替簡單的測試、不要過分地細化異常、利用異常層次結構、不要壓制異常、在檢測錯誤時,苛刻要比放任更好。
2.使用斷言
assert 條件;比如? ? ? ?和 ? ? ? ?assert 條件:表達式;比如 assert i%3==2;
這兩種形式都會對條件進行檢測,如果結果為false,則拋出一個AssertionError 異常。在第二種形式中,表達式將被傳入AssertionError的構造器,并轉換成一個消息字符串。
3.記錄日志
日志系統管理者是一個名為Logger.global的默認日志記錄器
Logger.getGlobal().info("File->Open menu item selected");在默認情況下,這條記錄會顯示出如下所示的內容:
May 10,2013 10:12:15 PM LoggingImageViewer fileOpen
INFO:File->Open menu item selected
取消所有日志:Logger.getGlobal().setLevel(Level.OFF);
高級日志:日志記錄級別 logger.setLevel(Level.FINE) SEVERE WARNING INFO 。。。
修改日志管理器配置,本地化?、處理器記錄格式為xml、過濾器、格式化器、使用調試器
第十二章:泛型程序設計
1.類型的參數的魅力在于:使得程序具有更好的可讀性和安全性。
泛型類?、泛型方法?、類型變量的限定?、泛型代碼和虛擬機?
2.約束與局限性
/**
*?instanceof運算符用法
*?運算符是雙目運算符,左面的操作元是一個對象,右面是一個類.當
*?左面的對象是右面的類創建的對象時,該運算符運算的結果是true,否則是false
*
*?說明:(1)一個類的實例包括本身的實例,以及所有直接或間接子類的實例
*?(2)instanceof左邊操作元顯式聲明的類型與右邊操作元必須是同種類或右邊是左邊父類的繼承關系,
*?(3)不同的繼承關系下,編譯出錯
*/
不能使用基本類型實例化類型參數、運行時類型查詢只適用于原始類型、不能創建參數化類型的數組、不能實例化類型變量、泛型類的靜態上下文中類型變量無效、不能拋出或捕獲泛型類的實例、注意擦除后的沖突、都沒看懂???
通配符類型:Pair<? extends Employee> ??
通配符的超類型限定、無限定通配符、通配符捕獲、反射和泛型
第十三章:集合
1.集合接口
數據結構
隊列:可以在隊列的尾部添加元素,在隊列的頭部刪除元素,并且可以查找隊列中元素的個數,當需要收集對象,并按照先進先出的規則檢索對象時就應該使用隊列。
隊列的實現方式有兩種,一種是循環數,另一種是用鏈表。
集合類的基本接口是Collection接口 ?
add方法,Iterator 迭代器,一個是添加的方法,一個是反復調用next方法,訪問集合中每個元素。從java5.0可用for each表達,
鏈表:在Java程序設計語言中,所有鏈表都是雙向鏈接的,即每個節點還存放著指向前驅節點的引用。
數組列表、散列集、散列碼、在java中散列表用鏈表數組實現,每個列表被稱為桶。
樹集,TreeSet、隊列與雙端隊列、優先級隊列、
數據結構:映射表 ? ?用來存放鍵/值對,如果提供了鍵就能查找到值。
映射表的視圖有三種,鍵集、值集合和鍵/值對集。
專用集與映射表類
弱散列映射表、連接散列集和連接映射表、枚舉集與映射表
EnumSet類沒有公共的構造器,可以使用靜態工廠方法構造。
2.集合框架
兩個基本接口:Collection和Map.
boolean add(E element) 、V put(k key,V value) 插入添加 ?V get(k key) 讀取某個元素?
視圖與包裝器:輕量級集成包裝器、子范圍、不可修改的視圖、同步視圖、檢查視圖、關于可選操作的說明、批操作、集合與數組之間的轉換、
3.算法
排序與混排Collections.sort、二分查找、簡單算法、編寫自己的算法
遺留的集合:hashtable類、枚舉、屬性映射表、棧、位集。
第十四章:多線程
1.多線程
一個程序同時執行多個任務,通常每一個任務稱為一個線程,它是線程控制的簡稱。可以同時運行一個以上線程的程序稱為多線程程序。
多進程與多線程的區別在于每個進程擁有自己的一整套變量,而線程則共享數據。
void start();啟動這個線程,將引發調用run()方法立即返回,并且新線程將并行運行。
void run();調用關聯Runnable的run方法
2.中斷線程
interrupt 方法可以用來請求終止線程。
3.線程狀態
new(新創建)、Runnable(可運行)、Blocked(被阻塞)、Waiting(等待)、Timed waiting(計時等待)、Terminated(被終止)
4.線程屬性
線程優先級(setPriority)、守護線程(setDaemon(true))、未捕獲異常處理器、
5.同步
鎖對象(synchronized)、條件對象
? 鎖可以用來保護代碼片段,任何時刻只能有一個線程執行被保護的代碼。
? 鎖可以管理視圖進入被保護代碼段的線程。
? 鎖可以擁有一個或多個相關的條件對象。
? 每個條件對象管理那些已經進入被保護的代碼段但還不能運行的線程。
同步阻塞、監視器概念、final變量、原子性、死鎖、線程局部變量、鎖測試與超時、讀/寫鎖、為什么棄用stop和suspend方法
6、阻塞隊列
7、線程安全的集合
高效的映射表、集合和隊列,寫數組的拷貝,較早的線程安全集合(Vector和Hashtable),Callable與Future
8、執行器,線程池,預定執行,控制任務組、同步器、線程與Swing?
本書已看完,還有些不懂的地方以后再向其他人請教吧。看了本書卷二的目錄,發現比較深并且與安卓關系不大,暫時先不看了吧。