第一篇:Java讀書筆記
讀書筆記
1、類和對象:類是用來定義一組對象共同具有的狀態和行為的模版。而對象是現實世界中個體或事物的抽象表示,并且封裝了它們的屬性和行為。
2、為了防止命名沖突,Java采用了管理類文件的機制,即類包機制。(package)定義包名的語法格式:
“package包名;”
Java命名規則要求包的命名需要使用小寫字母。
3、成員變量和成員方法:
1成員變量是在類體中定義的變量即全局變量,○成員變量一般用于定義對象的狀態。成員變量是給對象使用的,每個對象被創建后都會有屬于自己的屬性,即成員變量。通過修改這些屬性,從而改變對象的某個狀態。
2成員方法是對象行為的描述。○
定義成員方法的語法格式:
“[修飾符] 返回值類型方法名([形參表]){
······//方法體
}”
修飾符:可以是:publicprivateprotactedstaticfinall等;
返回值類型:如果方法需要返回值,必須這里聲明方法的返回值類型,可以是基
本數據類型(int short double booleanvoid等),也可以是對象
類型如:數組、字符串等。
形參表:(可選部分)說明方法被調用時應該向它傳遞的數據。形參表可以有一
個也可以有多個,當有多個形參時每個形參之間要用“,”隔開。
1創建對象:創建對象使用到new語句。
4、對象:○
聲明并創建對象的語法格式如下:
“類名對象名=new 類構造方法()”
構造方法:構造方法是類創建對象是必須執行的方法,用于構造一個新的對象并
初始化對象屬性。
2訪問對象的屬性: ○
語法格式:
“對象名.屬性”
3執行對象的行為:○對象的行為就是對象的成員方法,通常說調用或執行對象的某個方法。
語法格式:
“對象名.成員方法名();”
4對象的銷毀:Java提供了垃圾回收機制,對不再使用的對象會自動銷毀,也可○
以在程序中顯式的為某個對象賦null值,使對象不再被使用。
垃圾回收機制會找到并銷毀它,釋放該對象所占用的資源。
語法格式:
“對象名=null”
1創建類:Java中使用class關鍵字來創建類。
5、類:○
聲明并創建類的語法格式:
“權限修飾符 class類名{
類體;
}”
權限修飾符:(可選項)可以使用public protected private 或者省略這3者。類體主要由成員變量和方法兩部分組成。
2成員變量:在Java中對象的屬性也稱為成員變量。○
聲明并創建成員變量的語法格式:
“權限修飾符數據類型成員變量名;”
(用static關鍵字定義的成員變量被稱為靜態成員變量即類變量。靜態成員變量不是分配給每個對象的,而是屬于累的變量。它在內存中是唯一的,可以直接使用“類名.成員變量名”的格式去訪問,他在內存中的位置是固定的,是該類的所有實例對象所共享的存儲單元。)
3成員方法:在Java語言中使用成員方法對應與類對象的行為。○
定義成員方法的語法格式:
“權限修飾符返回值類型方法名(參數類型參數名){
·······//方法體
}”
(同類變量一樣,由static關鍵字定義的成員方法被稱為類方法,類方法可以不必創建對象而由類直接訪問,靜態方法不可以直接調用非靜態方法)4局部變量:○在方法體中聲明的變量為局部變量,局部變量的有效范圍為方法體結束。
5this關鍵字:在Java語言中用this關鍵字來代表類對象的引用,this關鍵字被○
隱式地用于引用對象的成員變量和方法。(在類方法中不可以使用this關鍵字。)this關鍵字和和對象都可以調用成員變量和方法,兩者的區別:
事實上,this引用的就是本類的一個對象,在局部變量或方法參數覆蓋了成員變量時,就要添加this關鍵字明確引用的是類成員還是局部變量的方法參數。6類的構造方法:構造方法與類同名。○
7類的主方法:主方法是類的入口點,它定義了程序從何處開始;主方法提供對○
程序流向的控制,Java編譯器通過主方法來執行程序。
1)主方法是靜態的,所以如果要直接在主方法體中
調用其他方法,則該方法必須也是靜態的。
2)主方法沒有返回值。
3)主方法的形參為數組。其中args[0]~args[n]分別
代表程序的第一個參數到第n個參數,可以使用
args.length獲取參數的個數。
Java中完整的類聲明格式:
“權限修飾符class類名{
權限修飾符數據類型成員變量名1;
權限修飾符數據類型成員變量名2;
·······
權限修飾符數據類型成員變量名n;
權限修飾符返回值類型成員方法名1(形參類型形參變量){ 方法體
}
權限修飾符返回值類型成員方法名2(形參類型形參變量){ 方法體
}
······
權限修飾符返回值類型成員方法名n(形參類型形參變量){ 方法體
} }”
6.由于類的主方法是靜態方法所以不可以調用類中的非靜態方法所以當需要調用非靜態方法時必須創建對象來調用。在輸入不同類型的數據時要使用不同的Scanner類對象,否則只能實現輸入一種數據類型。
7.abstract關鍵字是定義抽象類的關鍵字。使用abstract定義的發放成為抽象方法。抽象方法沒有方法體。抽象方法的唯一意義就是被重載。
第二篇:java高級Inside_JVM讀書筆記
本文首先介紹一下Java虛擬機的生存周期,然后大致介紹JVM的體系結構,最后對體系結構中的各個部分進行詳細介紹。
(首先這里澄清兩個概念:JVM實例和JVM執行引擎實例,JVM實例對應了一個獨立運行的java程序,而JVM執行引擎實例則對應了屬于用戶運行程序的線程;也就是JVM實例是進程級別,而執行引擎是線程級別的。)
一、JVM的生命周期
JVM實例的誕生:當啟動一個Java程序時,一個JVM實例就產生了,任何一個擁有public static void main(String[] args)函數的class都可以作為JVM實例運行的起點,既然如此,那么JVM如何知道是運行class A的main而不是運行class B的main呢?這就需要顯式的告訴JVM類名,也就是我們平時運行java程序命令的由來,如java classA hello world,這里java是告訴os運行Sun java 2 SDK的java虛擬機,而classA則指出了運行JVM所需要的類名。
JVM實例的運行:main()作為該程序初始線程的起點,任何其他線程均由該線程啟動。JVM內部有兩種線程:守護線程和非守護線程,main()屬于非守護線程,守護線程通常由JVM自己使用,java程序也可以標明自己創建的線程是守護線程。
JVM實例的消亡:當程序中的所有非守護線程都終止時,JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出。
二、JVM的體系結構
粗略分來,JVM的內部體系結構分為三部分,分別是:類裝載器(ClassLoader)子系統,運行時數據區,和執行引擎。
下面將先介紹類裝載器,然后是執行引擎,最后是運行時數據區
1,類裝載器,顧名思義,就是用來裝載.class文件的。JVM的兩種類裝載器包括:啟動類裝載器和用戶自定義類裝載器,啟動類裝載器是JVM實現的一部分,用戶自定義類裝載器則是Java程序的一部分,必須是ClassLoader類的子類。(下面所述情況是針對Sun JDK1.2)
動類裝載器:只在系統類(java API的類文件)的安裝路徑查找要裝入的類
用戶自定義類裝載器:
系統類裝載器:在JVM啟動時創建,用來在CLASSPATH目錄下查找要裝入的類
其他用戶自定義類裝載器:這里有必要先說一下ClassLoader類的幾個方法,了解它們對于了解自定義類裝載器如何裝載.class文件至關重要。
protected final Class defineClass(String name, byte data[], int offset, int length)
protected final Class defineClass(String name, byte data[], int offset, int length, ProtectionDomain protectionDomain);
protected final Class findSystemClass(String name)
protected final void resolveClass(Class c)
defineClass用來將二進制class文件(新類型)導入到方法區,也就是這里指的類是用戶自定義的類(也
就是負責裝載類)
findSystemClass通過類型的全限定名,先通過系統類裝載器或者啟動類裝載器來裝載,并返回
Class對象。
ResolveClass: 讓類裝載器進行連接動作(包括驗證,分配內存初始化,將類型中的符號引用解析為
直接引用),這里涉及到java命名空間的問題,JVM保證被一個類裝載器裝載的類所引用的所有類都被這個類裝載器裝載,同一個類裝載器裝載的類之間可以相互訪問,但是不同類裝載器裝載的類看不見對方,從而實現了有效的屏蔽。
2,執行引擎:它或者在執行字節碼,或者執行本地方法
要說執行引擎,就不得不的指令集,每一條指令包含一個單字節的操作碼,后面跟0個或者多個
操作數。
(一)指令集以棧為設計中心,而非以寄存器為中心
這種指令集設計如何滿足Java體系的要求:
平臺無關性:以棧為中心使得在只有很少register的機器上實現java更便利
compiler一般采用stack向連接優化器傳遞編譯的中間結果,若指令集以stack為基礎,則有利于運行
時進行的優化工作與執行即時編譯或者自適應優化的執行引擎結合,通俗的說就是使編譯和運行用的數據結構統一,更有利于優化的開展。
網絡移動性:class文件的緊湊性。
安全性:指令集中絕大部分操作碼都指明了操作的類型。(在裝載的時候使用數據流分析期進行一
次性驗證,而非在執行每條指令的時候進行驗證,有利于提高執行速度)。
(二)執行技術
主要的執行技術有:解釋,即時編譯,自適應優化、芯片級直接執行
其中解釋屬于第一代JVM,即時編譯JIT屬于第二代JVM,自適應優化(目前Sun的HotspotJVM
采用這種技術)則吸取第一代JVM和第二代JVM的經驗,采用兩者結合的方式
自適應優化:開始對所有的代碼都采取解釋執行的方式,并監視代碼執行情況,然后對那些經常調
用的方法啟動一個后臺線程,將其編譯為本地代碼,并進行仔細優化。若方法不再頻繁使用,則取消編譯過的代碼,仍對其進行解釋執行。
3,運行時數據區:主要包括:方法區,堆,java棧,PC寄存器,本地方法棧
(1)方法區和堆由所有線程共享
堆:存放所有程序在運行時創建的對象
方法區:當JVM的類裝載器加載.class文件,并進行解析,把解析的類型信息放入方法區。
(2)Java棧和PC寄存器由線程獨享,在新線程創建時間里
(3)本地方法棧: 存儲本地方法調用的狀態
上邊總體介紹了運行時數據區的主要內容,下邊進行詳細介紹,要介紹數據區,就不得不說明JVM
中的數據類型。
JVM中的數據類型:JVM中基本的數據單元是word,而word的長度由JVM具體的實現者來決定
數據類型包括基本類型和引用類型,(1)基本類型包括:數值類型(包括除boolean外的所有的java基本數據類型),boolean(在JVM中使
用int來表示,0表示false,其他int值均表示true)和returnAddress(JVM的內部類型,用來實現
finally子句)。
(2)引用類型包括:數組類型,類類型,接口類型
前邊講述了JVM中數據的表示,下面讓我們輸入到JVM的數據區
首先來看方法區:
上邊已經提到,方法區主要用來存儲JVM從class文件中提取的類型信息,那么類型信息是如何存儲的呢?眾所周知,Java使用的是大端序(big—endian:即低字節的數據存儲在高位內存上,如對于1234,12是高位數據,34為低位數據,則java中的存儲格式應該為12存在內存的低地址,34存在內存的高地址,x86中的存儲格式與之相反)來存儲數據,這實際上是在class文件中數據的存儲格式,但是當數據倒入到方法區中時,JVM可以以任何方式來存儲它。
類型信息:包括class的全限定名,class的直接父類,類類型還是接口類型,類的修飾符(public,等),所有直接父接口的列表,Class對象提供了訪問這些信息的窗口(可通過Class.forName(“”)或instance.getClass()獲得),下面是Class的方法,相信大家看了會恍然大悟,(原來如此?)
getName(), getSuperClass(), isInterface(), getInterfaces(), getClassLoader();
static變量作為類型信息的一部分保存
指向ClassLoader類的引用:在動態連接時裝載該類中引用的其他類
指向Class類的引用:必然的,上邊已述
該類型的常量池:包括直接常量(String,integer和float point常量)以及對其他類型、字段和方法的符號引用(注意:這里的常量池并不是普通意義上的存儲常量的地方,這些符號引用可能是我們在編程中所接觸到的變量),由于這些符號引用,使得常量池成為java程序動態連接中至關重要的部分
字段信息:普通意義上的類型中聲明的字段
方法信息:類型中各個方法的信息
編譯期常量:指用final聲明或者用編譯時已知的值初始化的類變量
class將所有的常量復制至其常量池或者其字節碼流中。
方法表:一個數組,包括所有它的實例可能調用的實例方法的直接引用(包括從父類中繼承來的)除此之外,若某個類不是抽象和本地的,還要保存方法的字節碼,操作數棧和該方法的棧幀,異常表。舉例:
class Lava{
private int speed = 5;
void flow(){}
}
class Volcano{
public static void main(String[] args){
Lava lava = new Lava();
lava.flow();
}
}
運行命令java Volcano;
(1)JVM找到Volcano.class倒入,并提取相應的類型信息到方法區。通過執行方法區中的字節碼,JVM
執行main()方法,(執行時會一直保存指向Vocano類的常量池的指針)
(2)Main()中第一條指令告訴JVM需為列在常量池第一項的類分配內存(此處再次說明了常量池并非
只存儲常量信息),然后JVM找到常量池的第一項,發現是對Lava類的符號引用,則檢查方法區,看Lava類是否裝載,結果是還未裝載,則查找“Lava.class”,將類型信息寫入方法區,并將方法區Lava類信息的指針來替換Volcano原常量池中的符號引用,即用直接引用來替換符號引用。
(3)JVM看到new關鍵字,準備為Lava分配內存,根據Volcano的常量池的第一項找到Lava在方法區的位置,并分析需要多少對空間,確定后,在堆上分配空間,并將speed變量初始為0,并將lava對象的引用壓到棧中
(4)調用lava的flow()方法
好了,大致了解了方法區的內容后,讓我們來看看堆
java對象的堆實現:
java對象主要由實例變量(包括自己所屬的類和其父類聲明的)以及指向方法區中類數據的指針,指向方法表的指針,對象鎖(非必需),等待集合(非必需),GC相關的數據(非必需)(主要視GC算法而定,如對于標記并清除算法,需要標記對象是否被引用,以及是否已調用finalize()方法)。
那么為什么java對象中要有指向類數據的指針呢?我們從幾個方面來考慮
首先:當程序中將一個對象引用轉為另一個類型時,如何檢查轉換是否允許?需用到類數據
其次:動態綁定時,并不是需要引用類型,而是需要運行時類型,這里的迷惑是:為什么類數據中保存的是實際類型,而非引用類型?這個問題先留下來,我想在后續的讀書筆記中應該能明白
指向方法表的指針:這里和C++的VTBL是類似的,有利于提高方法調用的效率
對象鎖:用來實現多個線程對共享數據的互斥訪問
等待集合:用來讓多個線程為完成共同目標而協調功過。(注意Object類中的wait(),notify(),notifyAll()方法)。
Java數組的堆實現:數組也擁有一個和他們的類相關聯的Class實例,具有相同dimension和type的數組是同一個類的實例。數組類名的表示:如[[Ljava/lang/Object 表示Object[][],[I表示int[],[[[B表示byte[][][]
至此,堆已大致介紹完畢,下面來介紹程序計數器和java棧
程序計數器:為每個線程獨有,在線程啟動時創建,若thread執行java方法,則PC保存下一條執行指令的地址。
若thread執行native方法,則Pc的值為undefined
Java棧:java棧以幀為單位保存線程的運行狀態,java棧只有兩種操作,幀的壓棧和出棧。
每個幀代表一個方法,java方法有兩種返回方式,return和拋出異常,兩種方式都會導致該方法對應的幀出棧和釋放內存。
幀的組成:局部變量區(包括方法參數和局部變量,對于instance方法,還要首先保存this類型,其中方法參數按照聲明順序嚴格放置,局部變量可以任意放置),操作數棧,幀數據區(用來幫助支持常量池的解析,正常方法返回和異常處理)。
本地方法棧:依賴于本地方法的實現,如某個JVM實現的本地方法借口使用C連接模型,則本地方法棧就是C棧,可以說某線程在調用本地方法時,就進入了一個不受JVM限制的領域,也就是JVM可以利用本地方法來動態擴展本身。
第三篇:Java編程思想讀書筆記
這是一份試圖提綱挈領的讀書筆記,《java編程思想》這本八百多頁的書娓娓道來地包含了太多細節,這對讀者是非常貼心的,我也強烈建議細細讀這本書,如果你希望在短時間內學會java這種語言,那么這本書不是最好的選擇,你可以看看譚浩強系列。我把看這本書的過程中,個人覺得每一章中最重要的思想、用整理在這里,希望自己回顧的時候有所參照和提高。也希望大家帶著同樣的目的來看本篇讀書筆記。
第一章 對象導論
比起過程型語言編寫的程序,用面向對象語言編寫的程序更加簡單、易于理解、可復用。《c++編程思想》里也有這一章,是一個拋磚引自己的玉的章節,不明白可以跳過,回頭再看。
第二章 一切都是對象
java語言里面,一切都是對象,并且程序員是通過引用來操縱對象。一個簡單的例子,非常輕松地讓讀者進入java的世界。需要注意的是java數據會儲存在5個不同的地方:寄存器、堆棧、堆、常量存儲、非ram存儲,用new創建的一般對象都放在堆中,而特殊的基本對象放在堆棧中,如果想把基本對象也放在堆中,需要包裝基本類型。
第三章 操作符
java中的操作符語法類似于c,所以學習起來一點困難也沒有。要特別注意兩個比較大的整數相加或者相乘的時候的溢出問題,用long或者biginteger解決這個問題。
第四章 控制執行流程
我想起《pointer on c》這本書第一章就有這一句話,本書適合那些希望迅速學習一門新語言而不是被“為什么if和for很重要”的弱智問題耽擱進度的讀者。呵呵,這一章很不厭其煩地介紹了運算、操作符優先級、類型轉換、選擇循環等基本特性,有c或者c++編程經驗的讀者可以大概瀏覽一下。
第五章 初始化和清理
關于初始化:
1.初始化很重要,一定不要忘記。而且java編譯器會很好的防止使用未初始化數據的意外,這是比c和c++更優的地方。
2.編譯器初始化的順序為:
a.類首次加載的時候,有關靜態初始化的所有動作都會執行。
a1.類的加載包括首次創建該類型的對象,或者該類的靜態方法/靜態域首次被訪問
a2.靜態域的初始化在一切初始化之前,即靜態變量散布在代碼不同的地方,它們也會在任何方法(包括構造器)調用之前被初始化
b.當用new calssname()創建對象的時候,會在堆上開辟足夠的存儲空間,這塊存儲空間被清零,然后執行字段的初始化動作。(這里的字段初始化都是非靜態的,因為靜態的變量已經在a中執行完畢,而且靜態變量存儲在不同的地方,靜態數據只占用一份存儲空間)
c.執行構造器
關于清理
c++關于清理的部分包含很大不確定性。目前需要知道的事情是,正常情況下,我們是不需要調用finalize方法的,而且垃圾回收區會自動回收不再使用的對象,同時我們需要自己注意一些需要關閉的文件。
需要注意的是,用=對數組進行“賦值”的時候,實際上是引用的傳遞,就是說,二者指向同一堆。
第六章 訪問權限控制
關于包
你應該有一個自己的域名,這樣發布你的java程序的時候,就可以將你的包名設置為你的域名倒轉。想要正確讓包工作,要正確設置classpath,對于新手來說,這的確是一個挑戰。我當初就難到了。
關于訪問權限修飾詞
值得注意的是,如果兩個編譯單元放在同一個目錄下并且都沒有設置包名的話,他們對于對方都是擁有包訪問權限的。訪問權限修飾詞是修飾方法和數據,而不是類。類只有兩種訪問權限,包訪問權限或public訪問權限。默認為包訪問權限。如果不希望其它任何人對該類擁有訪問權限,可以把所有的構造器設置為private。但是有一個例外,可以通過該類自己的static成員內部創建(于是就有了工廠設計模式和單例設計模式)。
第七章 復用類
有三種方法復用類:組合,繼承,代理。
組合即是在新的類里面放上已經定義的類的對象,然后通過調用它的方法來實現自己的功能。
繼承是通過extends關鍵詞繼承某一父類,這樣就能訪問父類的所有public方法(因此為了繼承,一般的規則是將父類的所有數據成員都指定為private,將所有的方法都指定為public)。子類的初始化需要注意的是,(當創建了一個子類的對象時,該對象包含一個基類的子對象)java會在子類的構造器中插入對基類默認構造器的調用。但是如果沒有默認的基類構造器,或者想調用一個帶參數的基類構造器,就必須用關鍵詞super顯式地編寫調用基類構造器的語句,并且配上適當的參數列表。
代理很有意思,(我們姑且使用導出類和基類這樣的字眼,但要清楚我們不是在討論繼承里面的關鍵詞)在導出類里保存一個基類的對象,然后用自己的方法對該基類的種種方法進行包裝。
如何決定使用哪種方法復用類呢?is-a就繼承,has-a就用組合。而且,組合比繼承總體上使用更廣泛、代價更小。
向上轉型
這個就牛逼了,第八章,第九章,第十章都與此密切相關。看完本書之后印象最深的就是向上轉型了。
使用final的原因有很多種,一定要弄清楚為什么使用final,是由于設計還是效率。
final作用于數據的時候:final作用在基本對象比如int上,該值就成為不可改變的,一旦被初始化就無法再被更改,但是作用在普通的對象引用的時候,final使引用恒定不變,但是引用指向的對象是可變的。編譯器需要我們確保final對象一定要被初始化,我們可以通過在構造器中初始化他們,以達到相對自由的效果(稱為空白final,我認為這個名字容易讓人誤解)。java允許在參數列表中以聲明的方式將參數指明為final,這一特性主要用來向匿名內部類傳遞數據(這很重要)。
final作用于方法的時候,說明作者想保持該方法在繼承的過程中不被改變,并且不被覆蓋。同時,被final修飾的方法會被關閉“動態綁定”,這樣編譯器就會為final方法調用生成“有限”有效的代碼。之所以說有限,是因為隨著編譯器的牛逼,它生成的代碼越來越有效。
final作用于類的時候,即是作者聲明對該類的設計不允許任何繼承。
學習得更深入一些,可能對以下事實感到有興趣:java中所有的事物都是對象,每個類的編譯代碼都存在于電腦中的文件夾里(文件夾的層次根據反轉域名得到),該文件只有在需要使用程序代碼時才被加載。具體的說,就是“類在其任何static成員函數(包括構造函數)被訪問時加載”。第八章 多態
多態的重要基本原理就是向上轉型:繼承允許將對象視為它自己本身的類型或其基類型加以處處理。
將一個方法調用和一個方法主題關聯起來稱為綁定,java中所有的方法都是后期綁定(除了static方法和final方法),所以我們可以編寫只與基類打交道的程序代碼,并且這些代碼對所有的導出類都可以正確運行。
(為什么static不動態綁定:因為static方法的主要用法就是用類名.方法名這樣的方式來調用,不存在“發送消息給某個對象,讓對象判斷自己怎么做”這樣的情況。
為什么final不動態綁定:這是早期final的一種用法,由程序員指定某方法為final,意味著程序員明了動態綁定的機制,并且聲明該方法不需要動態綁定,這樣可以獲得更好的性能。這種用法已經很少使用了。)
初始化的時候,導出類的構造函數會自動調用基類的默認構造函數,此過程一直遞歸到最基本的基類。如果需要調用有參數的構造函數就需要手動執行。反過來,如果需要進行清理工作(大部分時候我們都不需要),務必手動執行基類的清理工作先。比如繼承鏈的每個類都實現dispose()方法,那么執行某個類的清理工作的時候,需要手動調用super.dispose()。不過此種情況下,務必在執行super.dispose()之前釋放成員對象,清理順序與執行順序是相反的。
此外,構造器方面有更加復雜的調用機制,我們不用理它,只需要知道一條有效的準則“用盡可能簡單的方法使對象進入正常狀態,如果可以的話避免調用其它方法”。
java編譯器能夠允許向上多態,就是因為java的機制能保存對象的類型信息,即rtti,正因為這種機制,java編譯器也允許向下轉型,以獲得擴展類的“擴展出”的方法。(另,擴展類“擴展”了方法的這種繼承不是“純繼承”,這樣做好不好?用戶自己度量)。向下轉型失敗的話會拋出一個classcastexception。
雖然這一章都是在講多態,但是多態并不總是解決問題最好的方案,它有可能使事情不必要地復雜起來,我們應該總是優先考慮更加靈活的組合。
第九章 接口
一種專門提供“接口”的類叫抽象類,若含有至少一個abstract方法,該類就必須被聲明為abstract的。抽象方法沒有方法體,派生類必須實現它,否則派生類也必須被生命為抽象的。
interface關鍵詞使抽象的概念更進了一步:1.這個“類”完全抽象。2.一個類可以向上轉型為多種interface。要讓一個類遵循某個特定接口,需要使用implement關鍵字。
在這一章中出現了“策略設計模式”這個詞。創建一個能夠根據所傳遞的參數對象的不同而具有不同行為的方法,被稱為策略設計模式。
策略設計模式跟適配器設計模式聯合使用可以提供非常強大的功能,比如我們遇到了無法更改的類(別人編寫的),想要它滿足我們的接口然后放到設計模式里面去(當然滿足了接口之后的用法就不止如此了),就可以編寫一個適配器,包裝該類同時產生我所需要的接口。
使用抽象類和接口的兩個原因是:1.在多重繼承關系中(這真的很常見,看看java api就知道了),導出類可以被向上轉型為每一個接口。2.防止客戶端程序員創建該類的對象。那么我們該使用抽象類還是接口呢?事實上,如果知道某事物應該成為一個基類,那么第一選擇應該是使它成為一個接口。
接口之間的繼承能夠形成很好的體系,更像我們的現實生活。但是要特別注意的是,在不同接口中使用相同的方法名通常會造成代碼可讀性的混亂,令人不快。
工廠方法設計模式是又一個重要的設計模式。我們在代碼中增加額外的間接性,一個重要的原因是想要創建框架。
第四篇:讀書筆記《Java郵件開發詳解》
讀書筆記《Java郵件開發詳解》
DNS
MX
自動回復 不填from 避免循環回復。
Pop3:可以查郵件總數、已占空間。
電子郵件的RFC822格式:
Return-Path:代表郵件的回復地址,該字段的內容由接收郵件的SMTP服務器填寫,接收郵件的SMTP服務器從郵件發送程序發出的mail form命令中獲得內容。
Received:通常格式是:Received from A by B for C,A為發送方,B為接收方,C為收件人的郵箱地址。常常被用來追蹤郵件傳輸的路線和分析郵件的來源。From:
To:
Subject:
Date:
Cc:
Bcc:
郵件的頭字段可以擴充成MIME類型。Content-Type: multipart/mixed;頭字段指定編碼方法。另外,也定義了郵件頭字段的內涵。
MIME消息的頭字段具體資源的數據類型和組合消息的組合關系,都是通過消息頭中的Content-Type頭字段來指定的,格式為“主類型/子類型”的形式出現,主類型有text、image、audio、application、multipart、message等;每個主類型下面又都有好多子類型。
MIME消息可以有三種組合關系:
Multipart/mixed 混合組合 內容可以是文本、附件等等。
Multipart/related 關聯組合 如郵件正文要使用HTML代碼引用內嵌的圖片資源。意思是說某些資源要關聯引用另外的資源。
Multipart/alternative 選擇組合這三種關系是可以隨意嵌套的,比如你寄一個復雜的盒子出去,這個盒子里面可以有好多好多小盒子,而每個盒子都可以看作一個MIME。
其他的頭字段都是顧名思義的,略!
設置內容的另一種方法:
setContent(Object object, String type)
setContent(body, “text/html;charset=gb2312”);
另外一種客戶端的發信方式:SMTP服務器功能的郵件發送程序
具有SMTP服務器功能的郵件發送程序會根據收件人地址的域名,直接連接到該域的SMTP服務器和進行郵件發送。根本用不到??
JNDI:命名式:把對象綁定到context中;目錄式:保存對象的屬性信息實際應用中命名式和對象式常常結合使用。
Tomcat可以通過配置文件自己創建javax.mail.Session
META-INF/context.xml
auth=”Container” type=”javax.mail.Session” mail.smtp.host=”smtp.sina.com.cn” mail.transport.protool=”smtp” mail.smtp.auth=”true” /> 在web.xml中說明一下,有資源是被tomcat創建的,如果換了別的應用服務器也要創建。 不知道書上為什么費那么大勁找個Session出來,還是個沒有校驗的Session,收發郵件時都得再寫用戶名密碼給服務器。為什么不隨便new一個或者從System中調一個呢?感覺基本用不著,我自己寫一個properties文件豈不是更好? JAF 對于通過JAF封裝的數據,應用程序通過JAF提供的接口可以完成如下功能:。訪問數據源中的數據 。獲知數據源的數據類型 。獲知可對數據源進行的各種操作 。用戶對數據源執行某種操作時,自動創建執行該操作的軟件部件的實例對象 好像是用來封裝數據源的(比如:聲音文件,java文件),這樣的好處是?可以識別文件類型對文件直接操作?不知道,回頭再看看。好像是附件用的,ms。 郵件搜索 用于創建邏輯組合關系的類AND、OR、NOT、Comparison 用于創建具體搜索條件的類DATE、CONTENT、HEADER 例:SearchTerm st = new AndTerm(new FromStringTerm(“zx@sina.com”),new ReceivedDateTerm(ComparisonTerm.EQ, new Date())); 這里主要說明ComparisonTerm類,常用于日期類的比較其中使用留個常量來標識六種不同的操作:EQ(=)、GE(>=)、GT(>)、LE(<=)、LT(<)、NE(!=)郵件的解析與顯示 如果Message的類型是“text/*”直接顯示之。如果Message的類型 (getContentType())是“multipart/mixed”,調getContent()方法得到Multipart,對其調getCount()看看其中有多少個BodyPart,遍歷之;當MIME類型為“text/*”顯示之,當MIME是圖片、聲音或附件等二進制時,調 getDataHandler方法得到封裝數據的對象,然后調其getInputSteam??.;當MIME類型為“mutlipart/mixed”再次遍歷得到其中的BodyPart。 注意:Message.isMimeType(“multipart/*”)這個方法居然可以寫通配附?!看看API的解釋:If the subType of mimeType is the special character '*', then the subtype is ignored during the comparison.。 處理內嵌類型的multipart(multipart/related)直接交給IE瀏覽器去顯示就好了: response.setContentType(”message/rfc822”); message.writeTo(response.getOutputStream()); 總結: 總的來說這本書講的很基礎,前半部分告訴我們什么是email、email是如何收發的及email的格式、著重說明了smtp協議和pop3協議,甚至告訴大家怎么使用協議的命令收發郵件,這些對于使用API做web開發的程序員來說用處不是很大,但第3章郵件的組織結構講述的還是比較好的;后半部分主要對Javamail進行說明,但是我個人覺得不如IBM的在線教程介紹的實用,主要是例子寫的別扭,呵呵。不過里面有一些細節可以起到拓寬知識面的作用。 此書對開發webmail用處不是很大,比如對于pop3協議來說,如何標記郵件,如何建立文件夾,如何移動郵件,甚至通訊錄什么的都一點也沒有提到,講郵件搜索的時候沒有說郵件過濾能不能通過搜索實現或者還是有更好的辦法。更深入一點的比如用工廠模式解耦合、使用線程池提高性能等更是只字未提。哎~看來還得再找找,實在不行就操作數據庫,那樣麻煩很多但是應該什么都能實現。最近看webmail看的很不爽,網上這樣的東西也很少,感覺沒有一個套路...郁悶~~ 一 基礎知識點 1.面向對象程序設計(Object-oriented Programming OOP),UML(Unitied Modelling Language 統一建模語言)。將對象想像成“服務提供者”,它們看起來像什么?能夠提供哪 些服務?需要哪些對象? 2.Java中動態綁定是默認行為。Java采用動態內存分配方式,通過new操作在堆(Heap)的內 存池中動態創建對象。Java存儲結構類型:1)寄存器2)堆棧,主要存儲對象引用3)堆,主要用于存放所有的Java對象4)常量存儲,也就是程序代碼區5)非RAM存儲,如流對象 和持久化對象。基本類型不用new來創建變量,而且這個變量直接存儲”值”,并置于堆棧中。3.BigInteger和BigDecimal的使用。當變量作為類的成員使用時 當變量作為類的成員使用時,Java才確保給定其默認初 當變量作為類的成員使用時 始值,但是在方法中定義的變量,它有可能是任意值。面向對象的程序設計可以歸納為“向 對象發送消息”。關鍵字Static。4.Javadoc只能為public和protected成員進行文檔注釋,但是也可以通過-private進行標記注 釋。Javadoc常用方法: @see 引用其他類,link package.class#member label},{@ {@docRoot},{@inheritDoc},@version,@ author,@since,@param,@return,@throws,@deprecated。5.整數除法會直接去掉結果的小數位。基本類型的對象如果直接對它們賦值,對象指向同 一個常量存儲區,但是如果通過對象來初始化則會指向不同的堆的存儲區。如: String st1 = new String(“A”);String st2 = new String(“A”);st1==st2 false String st1 = “A”;String st2 = “A”;st1==st2 true 6.邏輯操作符:與(&&)、或(||)、非(!),其中與(&&)、或(||)會產生短路現象。& |也支持邏輯 也支持邏輯 運算操作。運算操作 7.直接常量中L代表Long,F代表Float,D代表Double。顯示二進制形式的話,可以通過Integer 和Long類的靜態方法toBinaryString()。如:Long.toBinaryString(10L)。 8.在返回void的方法中沒有return語句,那么在該方法的結尾處會有一個隱式的return。 一 般情況下每個方法都會有一個顯示的return語句。9.Break用于強行退出循環,不執行循環中剩余的語句,而continue則停止執行當前的迭代,然后退回循環起始處,開始下一次迭代。goto仍是Java的一個保留字,但在語言中并未使用它。Break和continue與標簽一起使用,可以中斷循環,直到標簽所在的地方。This用法: public class Leaf { int I = 0;Leaf increment(){ i++;return this;} } 10.回答一個新技術的問題大概思路和步驟是:我們想干什么,怎么干,干的過程中遇到了 什么問題,現在用什么方式來解決。答題時,先答是什么,再答有什么作用和要注意什么(這 部分最重要,展現自己的心得)。11.finalize的使用:垃圾回收只與內存有關,當“垃圾回收”時,finalize()得到調用。Java中 的對象都能被垃圾回收器回收,但是在“本地方法”的情況下,有可能在分配內存時采用類 似C語言的做法通過malloc()函數來分配存儲空間時,這時只能通過free()函數來釋放空間,而這些釋放操作必須要放到finalize()方法中,垃圾回收器才能正確的釋放內存。“垃圾回收” 都不保證一定會發生。 12.垃圾回收原理:引用記數 引用記數是一種簡單但速度很慢的垃圾回收技術。每個對象都含有一個 引用記數 Java 編程思想第四版 讀書筆記 引用記數器,當有引用連接至對象時,引用計數加1。當引用離開作用域或被置為null時,引用計數減1。垃圾回收器會在含有全部對象的列表上遍歷,當發現某個對象的引用計數為0 時,就立即釋放其占用的空間。定位交互自引用的對象組所需的工作量極大,所以并沒有被 應用于任何一種Java虛擬機中。Java虛擬機采用一種自適應 自適應的垃圾 回收技術,Java虛擬機會 自適應 進行監視,如果所有對象都很穩定,垃圾回收器的效率降低的話,就切換到“標記-清掃” 方式;同樣,Java虛擬機會跟蹤“標記-清掃”的效果,要是堆空間出現很多碎片,就會切 換回“停止-復制”方式。“停止-復制”,先暫停程序的運行,然后將所有存活 存活的對象從當前 存活 堆復制到另一個堆,沒有被復制的全部都是垃圾。“標記-清掃”,從堆棧和靜態存儲區出發,遍歷所有的引用,進而找出所有存活的對象,每當它找到一個存活對象,就會給對象設一個 標記,這個過程中不會回收任何對象,只有全部標記工作完成的時候,清理動作才會開始。在清理過程中,沒有標記的對象將被釋放,不會發生下任何復制動作。13.初始化順序:先靜態對象,后“非靜態”對象,先變量,再構造函數,然后是方法。靜態 初始化只有在必要時刻才會進行,如果不引用其對象,那么該對象中的靜態成員將不會被創 建,而且它們只會在第一次被訪問時進行初始化,其后不會再次被初始化。14.對象的創建過程:1)當首次創建對象時,或類的靜態方法/靜態域首次被訪問時,Java 解釋器必須查找類路徑,以定位.class文件。2)載入.class,有關靜態初始化的所有動作都會 執行。3)當用new 創建對象時,在堆上為對象分配存儲空間,而且這塊存儲空間會被清零,也就是說它會自動地將對象中的所有基本類型數據都設置成默認值,而引用是被設置成 null。4)執行所有出現于字段定義處的初始化動作。5)執行構造器。15.數組:java.util.Arrays常用方法的使用。binarySearch(),copyOf(),asList(),copyOfRange(),equals(),fill(),sort(),toString(),hashCode()。可變 參數列表:void f(float i,Character? args)。枚舉類型:enum,它可以在switch語句內使用。16.類的結構依次為:1)包的注釋2)package的設置3)import導入設置4)類的注釋5)類的編 寫。17.Java的訪問權限:類的訪問權限只有public和默認包訪問權限,成員和方法有 public,protected,默認包訪問權限和private。使用類的客戶端程序是無法訪問包訪問權限成員 的。包訪問權限的類的對象可以由包內任何其他類來創建和使用,但是包外則不行。18.為了繼承,一般的規則是將所有的數據成員都指定為private,將所有的方法指定為public 或protected。Java會自動在導出類的構造器中插入對基類構造器的調用。調用基類的構造器 必須是你在導出類構造器中要做的第一件事。19.代理,它是繼承與組合之間的中庸之道,因為我們將一個成員對象置于所要構造的類中(就像組合),但與此同時我們在新類中暴露了該成員對象的所有方法(就像繼承)。20.清理方法的順序:首先,執行類的所有特定的清理動作,其順序同生成順序相反;然后,調用基類的清理方法。除了內存之外,不能依賴垃圾回收器去做任何事,如果需要進行清理,最好是編寫自己的清理方法,但不要使用finalize()。@Override注解可以防止在你不想重載 時而意外地進行了重載。21.組合與繼承之間的選擇:組合技術通常用于想在新類中使用現有類的功能而非它的接口,也就是在新類的嵌入某個對象,讓其實現所需要的功能,但新類的用戶看到的只是為新類所 定義的接口,而非所嵌入對象的接口,一般情況下會在新類中嵌入一個現有類的private對象。而繼承,它是指使用某個現有類,并開發一個它的特殊版本。“is-a”(是一個)的關系是用 繼承來表達的,而“has-a”(有一個)的關系則是用組合來表達的。22.final的用法:根據慣例,既是static又是final的域將用大寫表示,并使用下劃線分隔各個單 詞。類中所有的private方法都隱式的指定為是final的。final類中所有的方法都隱式指定為是 final的。當前用HashMap替代了Hashtable,用ArrayList替代了Vector。 Java 編程思想第四版 讀書筆記 23.Java中除了static方法和final方法(private方法屬于final方法)之外,其他所有的方法都是 后期綁定。接口中的屬性都是public static final的,方法都是public 24.多態:只有普通的方法調用可以是多態的。任何域訪問操作都將由編譯器解析,因此不 是多態的。如果某個方法是靜態的,它的行為也不具有多態性。25.初始化的實際過程:1)在其他任 何事物發生之前,將分配給對象的存儲空間初始化成二 進制的零。2)如前所述那樣調用基類構造器,此時,調用被覆蓋后的方法(要在調用子類 構造器之前調用)。3)按照聲明的順序調用成員的初始化方法。4)調用導出類的構造器主 體。編寫構造器時有一條有效的準則: “用盡可能簡單的方法使對象進入正常狀態;如果可 以的話,避免調用其他方法”。在構造器內唯一能夠安全調用的那些方法是基類中的final方 法(也適用于private方法,它們自動屬于final方法)。這些方法不能被覆蓋。26.一條通用的準則是: “用繼承表達行為間的差異,并用字段表達狀態上的變化”。27.一個內部類的對象能訪問其外圍對象的所有成員,還擁有其外圍類的所有元素的訪問權。在內部類中,如果你需要生成對外部類對象的引用,可以使用外部類的名字后面緊跟圓點和 this,(OuterClass out = OuterClass.this)。有時你可能想要告知某些其他對象,去創建其某個 內部類的對象,可以在new表達式中提供對其他外部類對象的引用,需要使用.new語法(OuterClass out = new OuterClass, OuterClass.InnerClass inner = out.new InnerClass())。在擁 有外部類對象之前是不可能創建內部類對象的,但是,嵌套類(靜態內部類)除外。如果定 義一個匿名內部類,并希望它使用一個在其外部定義的對象,那么其參數引用必須是final 的。匿名類的實例初始化的實際效果就是構造器,而且你不能重載實例初始化方法,它可以 擴展類,也可以實現接口,但是實現接口,也只能實現一個接口。28.嵌套類(靜態內部類):1)要創建嵌套類的對象,并不需要其外圍類的對象;2)不能從嵌 套類的對象中訪問非靜態的外圍類對象。30.為什么需要內部類:1)每個內部類都能獨立繼承自一個(接口的)實現,所以無論外圍 類是否已經繼承了某個(接口的)實現,對于內部類都沒有影響。2)內部類可以更好的實 現“多重繼承”。3)內部類可以有多個實例,每個實例都有自己的狀態信息,并且與其外圍 類對象的信息相互獨立。4)在單個外圍類中,可以讓多個內部類以不同的方式實現同一個 接口或繼承同一個類。5)創建內部類對象的時刻并不依賴于外圍類對象的創建。 6)內部類 并沒有令人迷惑的“is-a”關系,它是一個獨立的實體。31.閉包:它是一個可調用的對象,它記錄了一些信息,這些信息來自于創建它的作用域。通過內部類提供閉包的功能是優良的解決方案。使用局部內部類而不使用匿名內部類的的理 由是需要不止一個該內部類的對象,或者需要一個已命名的構造器。32.內部類的繼承:內部類的構造器必須連接到指向其外圍類對象的引用,必須在構造器內 使用如下語法:enclosingClassReference.super();33.容器:List、Set、Query、Map。程序中不應該使用過時的Vector,Hashtable和Stack。常用的類有:Collection,Collections,Arrays,ArrayList,LinkedList,HashSet,TreeSet,LinkedHashSet, HashMap,TreeMap,LinkedHashMap,Query,Stack,PriorityQuery 迭代器:Iteratror,ListIterator3 Java 編程思想第四版 讀書筆記 34.異常:把當前異常對象重新拋出時,printStackTrace()方法顯示原來異常拋出點的調用棧 信息,要想更新這個信息,可以調用fillInStackTrace()方法。如: throw(Exception)e.fillInStackTrace()。35.異常鏈:在捕獲一個異常后拋出另一個異常,而且希望把原始異常的信息保存下來。現 在所有的Throwable的子類在構造器中都可以接受一個cause(因由)對象作為參數。這個cause 就用來表示原始異常,這樣通過把原始異常傳遞給新的異常,使得即使在當前位置創建并拋 出了新的異常,也能通過這個異常鏈追蹤到異常最初發生的位置。只有三種基本異常類(Error、Exception、RuntimeException)提供了帶cause參數的構造器,其他的異常只能使用 initCause()方法。36.當覆蓋方法的時候,只能拋出在基類方法的異常說明里列出的那些異常,或者拋出的異 常的子類或者不拋出異常。37.Java標準異常: Throwable這個Java類被用來表示任何可以作為異常被拋出的類。Throwable 對象可分為兩種類型(指從Throwable繼承而得到的類型):Error用來表示編譯時和系統錯誤(除 特殊情況外,一般不用你關心);Exception是可以被拋出的基本類型,在Java類庫、用 戶方法以及運行時故障中都可能拋出Exception型異常。所以Java程序員關心的基類型通常是 Exception。38.RuntimeException:Java運行時異常,它屬于Java的標準運行時檢測的一部分,它會自動被 Java虛擬機拋出,它也被稱為“不受檢查異常”,這種異常屬于錯誤,將被自動捕獲,不用 自己進行處理。除此之外的異常需要進行聲明,并進行捕獲或都向上拋出。只能在代碼中忽 略RuntimeException(及其子類)類型的異常,其他類型異常的處理都是由編譯器強制實施 的。RuntimeException代表的編程錯誤:1)無法預料的錯誤;2)作為程序同,應該在代碼 中進行檢查的錯誤。39.catch會捕獲基類異常本身以及所有從它派生的異常,如果將基類異常放在前面,子類異 常放在后面的話,子類異常永遠不會被捕獲,編輯器會報錯。Unreachable catch block for RuntimeException.It is already handled by the catch block for Exception。 40.異常處理的一個重要目標就是把錯誤處理的代碼同錯誤發生的地點分離。應該在下列情 況下使用異常:1)在恰當的級別處理問題。(在知道該如何處理的情況下捕獲異常) 2)解 決問題并且重新調用產生異常的方法。3)進行少許修被,然后繞過異常發生的地方繼續執 Java 編程思想第四版 讀書筆記 行。4)用別的數據進行計算,以代替方法預計會返回的值。5)把當前運行環境下能做的事 情盡量做完,然后把相同的異常重拋到更高層。6)把當前運行環境下能做的事情盡量做完,然后把不同的異常拋到更高層。7)終止程序。8)進行簡化。9)讓類庫和程序更安全。41.字符器:String,StringBuilder,Formatter.格式化語法: %[argument_index$][flags][width][.precision]conversion 在默認的情況下,數據是右對齊,不過可以通過使用“-”標志來改變對齊方向。42.正則表達式:意思是“我要插入一個正則表達式的反斜線,所以其后的字符具有特殊的 意義”。數字的正則表達式是:d,普通反斜線:,換行:n,制表符:t。要表示“一個 或多個之前的表達式”,使用+。“零個或多個”,使用?。(-|+)?:+在正則表達式中有特殊意 義,必須使用將其轉義。String類有matches()和split()方法處理正則表達式。43.我們通過java.util.regex.Pattern類和Matcher類來構造正則表達式對象。導入java.util.regex 包,用static Pattern.compile()方法來編譯正則表達式生成一個Pattern對象,再將你想要檢索 的字符串傳入Pattern對象的matcher()方法,它會生成一個Matcher對象,最后通過操作Matcher 對象來實現相關功能。還可以通過Scanner來完成正則表達式相關功能。44.在Java中,所有的類型轉換都是在運行進進行正確性檢查的。通過Class.forName()獲得 Class對象的引用,也可以通過Object類的getClass()方法來獲得。45.使用類的準備工作:1)加載,這是由類加載器執行,該步驟將查找字節碼,并從這些字 節碼中創建一個Class對象。2)鏈接,將驗證類中的字節碼,為靜態域分配存儲空間,并且 如果必需的話,將解析這個類創建的對其他類的所有引用。3)初始化,如果該類具有超類,則對其初始化,執行靜態初始化器和靜態初始化塊。(構造器隱式地是靜態的)。46.RTTI和反射之間的區別:對RTTI來說,編譯器在編譯時打開和檢查.class文件。而對于反 射機制來說,.class文件在編譯時是不可獲取的,所以是在運行時打開和檢查.class文件。47.泛型中T代表類型Class,要顯式地指明類型,必須在點操作符與方法名之間插入尖括號,然后把類型置于尖括號中;如果是在定義該方法的類的內部,必須在點操作符之前使用this 關鍵字,如果是使用static的方法,必須在點操作符之前加上類名。在泛型代碼內部,無法 獲得任何有關泛型參數類型的信息。在泛型中創建數組,推薦使用Array.newInstance()。泛 型( SuperClass> 48.任何基本類型都不能作為類型參數,但是可以使用它們的包裝類,如不能使用 ArrayList,但可以使用ArrayList 49.異常的分類:1)Error:稱為錯誤,由Java虛擬機生成并拋出,包括動態鏈接失敗、虛擬 機錯誤等,程序對其不做處理;2)Exception:所有異常類的父類,其子類對應了各種各樣可 能出現的異常事件,一般需要用戶顯示的聲明或捕獲; 3)Runtime Exception:一類特殊的異常,如被0除、數據下標超范圍等,其產生比較頻繁,處理麻煩,如果顯式的聲明或捕獲將會對 程序可讀性和運行效率影響很大。因此由系統自動檢測并將它們交給缺省的異常處理程序(用戶可不必對其處理)。50.使用自定義異常一般步驟:1)通過繼承java.lang.Exception類聲明自己的異常類;2)在 方法適當的位置生成自定義異常的實例,并用throw語句拋出; 在方法的聲明部分用throws 3)語句聲明該方法可能拋出的異常。 二 專項復習 1.容器 2.正則表達式 Java 編程思想第四版 讀書筆記 3.設計模式 4.異常 5.泛型 6.反射 7.多線程 8.IO 常用包(加粗是抽象類,斜體是接口,普通是類)三 J2SE 常用包(加粗是抽象類,斜體是接口,普通是類) 1.java.lang 提供利用 Java 編程語言進行程序設計的基礎類。Process、ProcessBuilder、Runtime、System、String、Object、Class、ClassLoader、Math、Compiler、Thread、ThreadGroup、Runnable、ThreadLocal、InheritableThreadLocal、Package 2.java.util ArrayList、Arrays、Collection、Collections、LinkedList、HashSet、TreeSet、Iterator、ListIterator、Map、HashMap、TreeMap、Comparator 歷史遺留的類:Dictionary、Hashtable、Properties、Stack、Vector、Enumeration 使用迭代函數的步驟:1)通過調用類集的iterator()或listIterator()方法獲得對類集頭的迭代函 數;2)建立一個調用hasNext()方法的循環,只要hasNext()返回true,就進行循環迭代;3)在循環內部,通過調用next()方法來得到每一個元素。GregorianCalendar、TimeZone、SimpleTimeZone、Locale、DateFormat、BitSet、Calendar、SimpleDateFormat、Random、Observer、Observable、Timer、TimerTask GregorianCalendar定義了兩個域:AD和BC。它們代表由公歷定義的兩個紀元。BC公元前,AD公元后 3.java.io InputStream、OutputStream Reader、Writer OutputStream、Reader Writer、FileInputStream、FileOutputStream、InputStream OutputStream Reader Writer ByteArrayInputStream、ByteArrayOutputStream、FilterOutputStream、FilterInputStream、BufferedInputStream、BufferedOutputStream、SequenceInputStream、PrintStream、RandomAccessFile FileReader、FileWriter、CharArrayReader、CharArrayWriter、BufferedReader、BufferedWriter、PrintWriter ObjectInputStream、ObjectOutputStream序列化的類必須實現java.io.Serializable 或 java.io.Externalizable 接口的對象才能從流讀取。4.java.net InetAddress、URL、URLConnection Java中有兩類TCP套接字。一種是服務器端的,另一種是客戶端的。ServerSocket類設 計成在等待客戶建立連接之前不做任何事的“監聽器”。Socket類為建立連向服務器套接 字以及啟動協議交換而設計。或 index.htm 文件。所以,http:/// 與http:///index.htm 是相同 的。Java通過兩個類實現UDP協議頂層的數據報:DatagramPacket對象是數據容器,DatagramSocket是用來發送和接受DatagramPackets的機制。5.java.rmi第五篇:Java編程思想第四版_讀書筆記