Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。大學網(wǎng)整理了JAVA的編程思想讀書筆記,歡迎大家閱讀。
java編程思想讀書筆記
對象具有狀態(tài),行為,標識.對象的五個基本特性:
萬物皆對象,抽取待求解問題的任何概念化構(gòu)件,將其表示為程序中的對象
程序是對象的集合,他們通過發(fā)送消息來告知彼此所要做的
每個對象都有自己的由其他對象所構(gòu)成的存儲,創(chuàng)建包含所有對象的包的方式來創(chuàng)建新類型的對象
每個對象都擁有其類型
某一特定類型的所有對象都可以接收同樣的消息
1。java還有個"缺省"的訪問權(quán)限,如果你沒用public、protected、private的話,那就是指它了。通常把它稱為package訪問權(quán)限。因為同屬這個package的類可以訪問這個package中其它類的"缺省"權(quán)限的成員,但是出了這個package,它們就都是private的了。
2。多態(tài)性,處理類系的時候,通常你不用把它當作某個具體的類型,只要把它當作基類對象就可以了,即把泛型的基類當作派生類來用。非oop的編譯器的做法是前綁定,即編譯器會產(chǎn)生那個名字的函數(shù)調(diào)用,而連接器負責將這個調(diào)用解析成須執(zhí)行的代碼的絕對地址。oop的編譯器用了后綁定,即當你向某個對象送了一個消息后,不到運行時,系統(tǒng)不能確定到底調(diào)用哪段代碼。java用存儲在對象中的信息來計算方法的地址,因此每個對象的運行都會不同。后綁定是java的缺省行為,c++中必須用virtual聲明。
3。abstract關鍵詞聲明類為抽象類,編譯器會阻止任何人創(chuàng)建abstract類的對象,而只是把其派生類的對象上傳給它。abstract也可以聲明方法,表示這個類所派生的所有類都有這個方法,但是它的實現(xiàn)不在這里。abstract方法只能存在于abstract類中。
4。interface關鍵詞是對abstract類的概念的深化,它不允許你實現(xiàn)任何方法,只作為接口使用.可以繼承多個接口,java中無類多重繼承。
5。c++支持的變量有自動、靜態(tài)、寄存器和堆,java只支持堆變量,每次創(chuàng)建對象的時候都要用new來動態(tài)分配堆內(nèi)存。
6。容器和迭代器:容器:c++標準模板類庫stl = java標準類庫的容器類,迭代器:將基于不同數(shù)據(jù)結(jié)構(gòu)的容器抽象為一個簡單線性序列的類。
7。java是單根繼承體系,object作為最終基類使所有對象都具有某些基本操作。單根繼承和系統(tǒng)通過reference操控對象,使垃圾回收器可以釋放堆內(nèi)存。
8。java容器只持有object對象,單根繼承使它能持有任何對象上傳只要把對象的reference直接放入即可,取對象時,必須知道它原有的類型,從容器中取出對象的reference然后強制轉(zhuǎn)換為原因類型(下傳:由基類到其派生類)。
9。參數(shù)化類型:能夠根據(jù)需要由編譯器自動指派類型的類,c++的模板template即參數(shù)化類型。java暫不支持
10。異常是一種能從錯誤發(fā)生的地方被拋出的對象,并被能解決這類問題的異常處理程序所捕獲,異常肯定能得到處理,并且能夠從錯誤狀態(tài)下恢復。java的異常處理是從底層開始的,而且還不能不用,否則就不能編譯通過。
11。java語音內(nèi)置了多線程支持,線程被表示為對象,java還有一定的資源鎖定功能,可以通過synchronized關鍵字鎖定對象內(nèi)存。
12。持久性:java可以通過對象的序列化或java數(shù)據(jù)對象來實現(xiàn)把對象從磁盤中存儲和提取。
13。傳統(tǒng)w/s:瀏覽器上送web服務器的數(shù)據(jù)由web服務器上的通用網(wǎng)關接口程序CGI處理,常用語言perl、python、C++等。
14。客戶端編程:插件:可以為瀏覽器添加新的功能,甚至創(chuàng)造新的客戶端編程語言。腳本語言:把客戶端的源代碼直接嵌入到html頁面中,html頁面顯示的時候自動激活插件解釋這些程序。常用腳本語言javascript、vbscript、tcl/tk等。java:可以通過applet和java web start進行客戶端編,applet是一個只能運行在web瀏覽器里的小程序,applet是被編譯過的代碼,作為web頁面的一部分自動下載,在被激活的時候開始運行。java web start分發(fā)在web瀏覽器外運行的獨立程序。Activex操作上不受限制。
15。servlet和jsp是使人們轉(zhuǎn)向使用java開發(fā)網(wǎng)站的主要原因。
java編程思想讀書筆記
《Java編程思想》學習筆記
1——面向?qū)ο蠛蚃VM基礎
1.java中的4種訪問制權(quán)限:
(1).public:最大訪問控制權(quán)限,對所有的類都可見。
(2).protect:同一包可見,不在同一個包的所有子類也可見。
(3).default:包訪問權(quán)限,即同一個包中的類可以可見。默認不顯式指定訪問控制權(quán)限時就是default包訪問控制權(quán)限。
(4).private:最嚴格俄訪問控制權(quán)限,僅該類本身可見,對外一切類都不可以訪問(反射機制可以訪問)。
2.面向?qū)ο缶幊讨袃煞N對象組合方式——is-a 和 has-a:
(1).is-a組合:一個類繼承具有相似功能的另一個類,根據(jù)需要在所繼承的類基礎上進行擴展。
優(yōu)點:具有共同屬性和方法的類可以將共享信息抽象到父類中,增強代碼復用性,同時也是多態(tài)的基礎。
缺點:子類中擴展的部分對父類不可見,另外如果共性比較少的時候使用繼承會增加冗余代碼。
(2).has-a組合:has-a組合是在一個類中引用另一個類作為其成員變量。 優(yōu)點:可擴展性和靈活性高。在對象組合關系中應優(yōu)先考慮has-a組合關系。 缺點:具有共性的類之間看不到派生關系。
3.多態(tài):
在面向?qū)ο缶幊讨校宇愔袚碛泻透割愊嗤椒ê灻姆椒ǚQ為子類方法覆蓋父類方法,當調(diào)用子類方法的某個操作時,不必明確知道子類的具體類型,只需要將子類類型看作是父類的引用調(diào)用其操作方法,在運行時,JVM會根據(jù)引用對象的具體子類類型而調(diào)用應該的方法,這就是多態(tài)。
多態(tài)的基礎是java面向?qū)ο缶幊痰耐斫壎C制。編程中有如下兩種綁定機制:
(1).早綁定:一般在非面向?qū)ο缶幊陶Z言中使用,在程序編譯時即計算出具體調(diào)用方法體的內(nèi)存地址。
(2).晚綁定:面向?qū)ο缶幊陶Z言中經(jīng)常使用,在程序編譯時無法計算出具體調(diào)用方法體的內(nèi)存地址,只進行方法參數(shù)類型和返回值類型的校驗,在運行時才能確定具體要調(diào)用方法體的內(nèi)存地址。
4.java單繼承的優(yōu)點:
相比于C++的多繼承,java只支持類的單繼承,java中的所有類的共同基類是Object類,Object類java類樹的唯一根節(jié)點,這種單繼承有以下好處:
(1).單繼承可以確保所有的對象擁有某種共同的特性,這樣對于JVM虛擬機對所有的類進行系統(tǒng)級的操作將提供方便,所有的java對象可以方便地在內(nèi)存堆棧中創(chuàng)建,傳遞參數(shù)也變的更加方便簡單。
(2).java的單繼承使得實現(xiàn)垃圾回收器功能更加容易,因為可以確保JVM知道所有對象的類型信息。
5.選擇容器對象兩個原則:
(1).容器所能提供不同的類型的接口和外部行為是否能夠滿足需求。
(2).不同容器針對不同的操作效率不同。
6.類型轉(zhuǎn)換:
Java中有兩種常見的類型轉(zhuǎn)換:向上類型轉(zhuǎn)換(upcast)和向下類型轉(zhuǎn)換(downcast):
(1).向上類型轉(zhuǎn)換(upcast):
向上類型轉(zhuǎn)換是將子類對象強制類型轉(zhuǎn)換為父類類型,經(jīng)典用法是面向?qū)ο蟮亩鄳B(tài)特性。向上類型轉(zhuǎn)換時,子類對象的特性將不可見,只有子類從父類繼承的特性仍然保持可見,向上類型轉(zhuǎn)換時編譯器會自動檢查是否類型兼容,通常是安全的。
(2).向下類型轉(zhuǎn)換:
向下類型轉(zhuǎn)換是將父類類型強制轉(zhuǎn)換為子類類型,轉(zhuǎn)換過后父類中不可見的子類特性又恢復可見性,向下類型轉(zhuǎn)換時,編譯器無法自動檢測是否類型兼容,往往會產(chǎn)生類型轉(zhuǎn)換錯誤的運行時異常,通常不安全。
7.java中5個存放數(shù)據(jù)的地方:
(1).寄存器(Registers):位于CPU內(nèi)部,是速度最快的存儲區(qū),但是數(shù)量和容量有限。在java中不能直接操作寄存器。
(2).棧(Stack):棧位于通用隨機訪問存儲器 (General random-access memory,RAM,內(nèi)存) 中,通過處理器的棧指針訪問,棧指針從棧頂向棧底分配內(nèi)存,從棧底向棧頂釋放內(nèi)存。棧是僅次于寄存器的速度第二快的存儲器,在java程序中,一般的8種 基本類型數(shù)據(jù)和對象的引用通常存放在棧內(nèi)存中,不通過new關鍵字的字符串對象也是存放在棧的字符串池中。棧的優(yōu)勢是,存取速度比堆要快,僅次于寄存器, 棧數(shù)據(jù)可以共享。但缺點是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。
(3).堆(Heap):也是位于通用隨機訪問存儲器 (General random-access memory,RAM,內(nèi)存) 中的共享內(nèi)存池。Java的堆是一個運行時數(shù)據(jù)區(qū),類的對象從中分配空間,凡是通過new關鍵字創(chuàng)建的對象都存放在堆內(nèi)存中,它們不需要程序代碼來顯式的 釋放。堆是由垃圾回收來負責的,堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態(tài)分配內(nèi)存的,Java的垃圾收集器 會自動收走這些不再使用的數(shù)據(jù)。但缺點是,由于要在運行時動態(tài)分配內(nèi)存,存取速度較慢。
(4).常量存儲器(Constant storage):java中的常量是存放在系統(tǒng)內(nèi)嵌的只讀存儲器中(read-only memory,ROM)的。
(5).非隨機存儲器(Non-RAM storage):對于流對象和持久化對象,通常存放在程序外的存儲器,如硬盤。
8.javadoc只處理public和protected訪問控制權(quán)限的文檔注釋,private和default權(quán)限的穩(wěn)定注釋將被忽略。
9.java中賦值運算:
基本類型賦值是直接復制值,賦值操作后,相互不影響。
引用類型賦值是復制引用值,相當于給對象取一個別名,賦值之后兩個引用指向同一個引用對象,相互之間有影響。
在Java中,向方法傳遞引用類型參數(shù)會改變參數(shù)的值,不讓參數(shù)受到影響的解決方法:在方法內(nèi)首先先將引用克隆一份,然后操作克隆的對象。
10.移位運算:
左移運算符<<:將比特位左移指定位數(shù),右邊部分補0,左移一位相當于乘2。
右移運算符>>:將比特位右移指定位數(shù),如果是正數(shù),左邊第一位(符號位)補0,其余位補0,如果是負數(shù),左邊第一位補1,其余位補0。右移一位相當于除2。
無符號右移運算符>>>:將比特位右移指定位數(shù),不論是正數(shù)或者負數(shù),左邊移除位統(tǒng)統(tǒng)補0。
11.java中,比int類型小的原始類型(char、byte、short)進行數(shù)學運算或者位運算時,數(shù)據(jù)類型首先轉(zhuǎn)換成int類型,然后進行相應的運算。
12.方法重載(overloading):方法同名,參數(shù)列表不同稱為方法重載,注意方法的返回值類型不同不能作為方法重載。
13.java中的析構(gòu)函數(shù):
Java中沒有像C/C++的析構(gòu)函數(shù),用來銷毀不用的對象是否內(nèi)存空間,只有以下三個方法用于通知垃圾回收器回收對象。
(1).finalize( )只是通知JVM的垃圾收集器當前的對象不再使用可以被回收了,但是垃圾回收器根據(jù)內(nèi)存使用狀況來決定是否回收。
finalize()最有用的地方是在JNI調(diào)用本地方法時(C/C++方法),調(diào)用本地方法的析構(gòu)函數(shù)消耗對象釋放函數(shù)。
(2). System.gc()是強制析構(gòu),顯式通知垃圾回收器釋放內(nèi)存,但是垃圾回收器也不一定會立即執(zhí)行,垃圾回收器根據(jù)當前內(nèi)存使用狀況和對象的生命周期自行決定是否回收。
(3).RunTime.getRunTime().gc()和System.gc()類似。
注意:這三個函數(shù)都不能保證垃圾回收器立即執(zhí)行,推薦不要頻繁使用。
14.垃圾回收器原理:
(1).引用計數(shù)(ReferenceCounting)垃圾回收算法:
一種簡單但是速度較慢的垃圾回收算法,每個對象擁有一個引用計數(shù)器
(Reference Counter),當每次引用附加到這個對象時,對象的引用計數(shù)器加1。當每次引用超出作用范圍或者被設置為null時,對象的引用計數(shù)器減1。垃圾回收 器遍歷整個對象列表,當發(fā)現(xiàn)一個對象的引用計數(shù)器為0時,將該對象移出內(nèi)存釋放。
引用計數(shù)算法的缺點是,當對象環(huán)狀相互引用時,對象的引用計數(shù)器總不為0,要想回收這些對象需要額外的處理。
引用計數(shù)算法只是用來解釋垃圾回收器的工作原理,沒有JVM使用它實現(xiàn)垃圾回收器。
引用計數(shù)的改進算法:
任何存活的對象必須被在靜態(tài)存儲區(qū)或者棧(Stack)中的引用所引用,因此當遍歷全部靜態(tài)存儲區(qū)或棧中的引用時,即可以確定所有存活的對象。每當 遍歷一個引用時,檢查該引用所指向的對象,同時檢查該對象上的所有引用,沒有引用指向的對象和相互自引用的對象將被垃圾回收器回收。
(2).暫停復制(stop-and-copy)算法:
垃圾回收器的收集機制基于:任何一個存活的對象必須要被一個存儲在;蛘哽o態(tài)存儲區(qū)的引用所引用。
暫停復制的算法是:程序在運行過程中首先暫停執(zhí)行,把每個存活的對象從一個堆復制到另一個堆中,已經(jīng)不再被使用的對象被回收而不再復制。 暫停復制算法有兩個問題:
a.必須要同時維護分離的兩個堆,需要程序運行所需兩倍的內(nèi)存空間。JVM的解決辦法是在內(nèi)存塊中分配堆空間,復制時簡單地從一個內(nèi)存塊復制到另一個內(nèi)存塊。
b.第二個問題是復制過程的本身處理,當程序運行穩(wěn)定以后,只會產(chǎn)生很少的垃圾對象需要回收,如果垃圾回收器還是頻繁地復制存活對象是非常低性能的。
JVM的解決方法是使用一種新的垃圾回收算法——標記清除(mark-and-sweep)。 一般來說標記清除算法在正常的使用場景中速度比較慢,但是當程序只產(chǎn)生很少的垃圾對象需要回收時,該算法就非常的高效。
(3).標記清除(mark-and-sweep)算法:
和暫停復制的邏輯類似,標記清除算法從棧和靜態(tài)存儲區(qū)開始追蹤所有引用尋找存活的對象,當每次找到一個存活的對象時,對象被設置一個標記并且不被回收,當標記過程完成后,清除不用的死對象,釋放內(nèi)存空間。
標記清除算法不需要復制對象,所有的標記和清除工作在一個內(nèi)存堆中完成。
[java編程思想讀書筆記]